我希望某个命名空间中的每个类都实现IEquatable(Of thatClass)
及其对应的GetHashCode
。
Namespace DAO
Public Class Product : Implements IEquatable(Of Product)
Shadows Function Equals(ByVal other As Product) As Boolean Implements IEquatable(Of Product).Equals
Shadows Function GetHashCode() As Integer
End Class
End Namespace
我可以“记住”实施这两种方法,但那是不好的做法。
我可以编写一个接口IDao并再次“记住”让所有类实现该接口。但是接口无法实现另一个接口。
Public Interface IDao : Implements IEquatable ' <---- NO!
好的,所以我可以创建一个抽象类(糟糕,Dao类将无法从其他类继承)并再次记住让所有类继承它:
Public MustInherit Class DaoBase : Implements IEquatable(Of DaoBase)
MustOverride Shadows Function Equals(ByVal other As DaoBase) As Boolean Implements IEquatable(Of DaoBase).Equals
MustOverride Shadows Function GetHashCode() As Integer
End Class
Public Class Product
Inherits DaoBase
Overrides Function Equals(ByVal other As DaoBase) As Boolean
Return ???
End Function
现在,Equals中的参数是DaoBase,而不是Product。我可以演员,但是......
或者我可以将DaoBase概括为:
Public MustInherit Class DaoBase(Of T) : Implements IEquatable(Of T)
MustOverride Shadows Function Equals(ByVal other As T) As Boolean Implements IEquatable(Of T).Equals
MustOverride Shadows Function GetHashCode() As Integer
End Class
但这意味着将为每个继承类创建不同的DaoBase。
有没有办法声明DaoBase非泛型和让子类处理正确的类型?
很高兴:强制命名空间中的每个类按合同实现接口。所以我不必记住;)
答案 0 :(得分:1)
接口无法实现其他接口,但可以从其他接口继承。 以下作品:
Public Interface IDao
Inherits IEquatable
End Interface
所以你可以用这种方法应用你最初的想法