【问题标题】:vb.net and interface implementationvb.net及接口实现
【发布时间】:2013-05-15 15:51:24
【问题描述】:

我希望某个命名空间中的每个类都实现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 非泛型并且让子类处理正确的类型?

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

【问题讨论】:

    标签: vb.net generics interface


    【解决方案1】:

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

    Public Interface IDao 
        Inherits IEquatable 
    
    End Interface
    

    所以你可以用这种方法应用你最初的想法

    【讨论】:

    • 它必须继承自IEquatable(Of IDao),然后类型转换问题仍然适用。
    • + 1 另外——我质疑在整个命名空间中实现继承接口(或继承任何东西),以便作者“记住”这样做。如果它对您的域模型有意义,则实现一个接口,并出于同样的原因按照描述进行继承。但不要仅仅为了使编码更容易而继承——这可能会导致痛苦。以在您的领域内有意义的方式使用继承/接口 - 而不是作为重用代码或简化代码编写的手段。最后,您将通过坚持前两个方面的良好做法来完成后两个。
    • @XIVSolutions:如果接口 X 继承了接口 Y,则可以将 X 类型的变量传递给不需要类型转换的期望 Y 的例程。在应该允许这种隐式类型转换的情况下,接口应该继承其他接口,在应该禁止的情况下不应该继承。
    • 你可以让它泛型,这样IDao(Of T)继承自IEquatable(Of T)
    猜你喜欢
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2015-09-30
    • 2014-02-15
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    相关资源
    最近更新 更多