【发布时间】: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