【问题标题】:Implementing IEquatable in a base class and use it in all the derived classes在基类中实现 IEquatable 并在所有派生类中使用它
【发布时间】:2015-06-05 05:39:07
【问题描述】:

我有一个实现 IEquatable 接口的基类:

Public MustInherit Class DaoBase : Implements IEquatable(Of DaoBase)

        MustOverride Function getPrimaryKey() As Integer

        Shadows Function Equals(other As DaoBase) As Boolean Implements IEquatable(Of DaoBase).Equals
            Return getPrimaryKey() = other.getPrimaryKey
        End Function

        Overrides Function GetHashCode() As Integer
            Return getPrimaryKey()
        End Function

        ' more things here
 End Class

所有子类都必须提供getPrimaryKey 方法。

Public Class Packaging
        Inherits DaoBase

    Public Sub New(id As Integer)
        Me.id = id
    End Sub

    Overrides Function getPrimaryKey() As Integer
        Return id
    End Function

    <DaoField> Property id As Integer

End Class

List(Of Packaging).Contains 从不按预期调用Equals 方法。

Dim packs As new List(Of Packaging)()
Dim pack As New Pack(1)
Dim pack2 As New Pack(1)
packs.Add(pack)

现在,packs.Contains(pack)

但是,packs.Contains(pack2)

我不想“记住”在派生类中实现IEquatable

有没有办法强制派生实现他们的IEquatable,或者更好的是,让Contains调用基类DaoBase.Equals

【问题讨论】:

  • 你在这行末尾缺少() getPrimaryKey() = other.getPrimaryKey 吗?
  • 您的代码应该可以正常工作 - 这是Template Method 设计模式的经典实现。
  • IEquatable 是指结构不是吗?
  • 不,它不起作用,因为 IEquatable 是为基类定义的,它永远不会被调用。

标签: .net vb.net interface containers


【解决方案1】:

我找到的唯一解决方案是泛型化基类:

Public MustInherit Class DaoBase(Of T) : Implements IEquatable(Of T)

    MustOverride Shadows Function Equals(other As T) As Boolean Implements IEquatable(Of T).Equals
    MustOverride Overrides Function GetHashCode() As Integer

End Class

Public Class Packaging
    Inherits DaoBase(Of Packaging)

    Public Sub New(id As Integer)
        Me.id = id
    End Sub

    Overrides Function Equals(other As Packaging) As Boolean
        Return GetHashCode() = other.GetHashCode()
    End Function

    Overrides Function GetHashCode() As Integer
        Return id
    End Function

    Property id As Integer
End Class

现在必须重写 Equals 并专门针对派生类型。

    Dim p1 As New Packaging(1)
    Dim p2 As New Packaging(1)

    Dim packs As New List(Of Packaging)
    packs.Add(c1)

    Debug.Print(packs.Contains(c1))         <- TRUE
    Debug.Print(packs.Contains(c2))         <- TRUE

但我必须在所有派生类中编写许多相同的 Equals 方法。我一直在寻找避免这种情况的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-10
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 2017-07-04
    • 2011-11-04
    • 1970-01-01
    相关资源
    最近更新 更多