2013-05-15 72 views
0

我希望某个名称空间中的每个类实现IEquatable(Of thatClass)及其对应的GetHashCodevb.net和接口实现

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非通用有子类处理正确的类型?

很高兴:强制命名空间中的每个类通过契约实现接口。所以我不必记住;)

回答

1

一个接口不能实现另一个接口,但它可以从另一个接口继承。 以下工作:

Public Interface IDao 
    Inherits IEquatable 

End Interface 

所以,你可以用这种方法

+0

它从继承应用您最初的想法'IEquatable(中IDao)'然后类型转换的问题仍然适用。 – vulkanino

+1

+ 1另外 - 我想问一个贯穿整个命名空间的继承接口(或继承任何事情),只是为了让作者“记得”这样做。如果它对你的域模型有意义,则实现一个接口,并按照同样的原因继承。但不能简单地继承以简化编码 - 这可能会导致痛苦。以在您的域中有意义的方式使用继承/接口 - 而不是重用代码或使代码编写更容易的方式。最后,你将通过坚持前两项的良好实践来完成后两项任务。 – XIVSolutions

+1

@XIVSolutions:如果接口X继承接口Y,那么可以将类型X的变量传递给期望Y而没有类型转换的例程。在应该允许这种隐式类型转换的情况下,接口应该继承其他接口,并且在应该禁止的情况下不应该继承。 – supercat