2015-03-31 45 views
0

我有一個基類,它實現接口IEquatable使用它:實施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) < - TRUE,OK,參考平等

但是,packs.Contains(pack2) < - FALSE,NOK!

我不想「記住」在派生類中實現IEquatable

有沒有辦法強制派生來實現他們的IEquatable,或者,甚至更好的做法是讓Contains調用基類DaoBase.Equals

+0

你在這行'getPrimaryKey()= other.getPrimaryKey'的末尾是否缺少'()'? – dasblinkenlight 2015-03-31 18:48:54

+0

您的代碼應該正常工作 - 這是[* Template Method *](http://en.wikipedia.org/wiki/Template_method_pattern)設計模式的經典實現。 – dasblinkenlight 2015-03-31 18:50:39

+0

IEquatable 是爲結構否? – 2015-03-31 18:51:24

回答

0

我發現的唯一的解決辦法就是仿製IZE基類:

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 

現在等於必須重寫和專門的派生類型。

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 

但我必須在所有派生類中編寫許多相同的等式方法。我正在尋找一種方法來避免這種情況。