子接口的Load(x)函数隐藏父接口的Load()函数

时间:2014-04-04 11:28:03

标签: vb.net inheritance interface

我有以下通用接口

Public Interface IGenericDAO(Of T As {Class, IEntity})

    Sub Save(entity As T)

    Sub Delete(entity As T)

    Sub Delete(id As Long)

    Function Load(id As Long) As T

    Function Load() As List(Of T)

End Interface

我想要另外一个这样的

Public Interface IAgendaDAO
    Inherits IGenericDAO(Of Agenda)

    Function Load(isPublished As Boolean, meetingType As MeetingType) As List(Of Agenda)

    Function Load(meetingType As Boolean) As List(Of Agenda)

End Interface

但是在这种情况下编译器说我的Load函数隐藏了我的Load函数而没有参数 我可以在C#中做这样的事情,为什么我不能在VB.NET中? 我该怎么做才能解决这个问题?我应该以不同方式命名我的功能吗?

1 个答案:

答案 0 :(得分:2)

是的,这是语言设计师需要做出的基本选择之一。核心决策是当派生类的成员与基类中的成员具有完全相同的名称时,究竟应该发生什么。这可以隐藏继承的基类成员,并使其难以使用基本成员。并且冒险,无辜的维护更改可能突然不再隐藏基础成员并破坏现有代码。

C#语言设计师去了#34;隐藏签名"。换句话说,只有基本方法具有完全相同的名称完全相同的参数时,方法才会隐藏。这就是您习惯并希望在这些接口声明中发生的事情。

其他语言,例如C ++和VB.NET,用于"隐藏名称"。换句话说,一个方法在具有相同名称时隐藏,无论它采用什么参数。这是一个"较少的惊喜"选择,理由更容易,维护更改不太可能改变现有代码的行为。

您可以在此示例代码中看到这一点:

Class Base
    Sub foo()
    End Sub
End Class

Class Derived
    Inherits Base

    Sub foo(i As Integer)   '' Warning: 'foo' shadows an overloadable member declared in Base
    End Sub

    Shadows Sub foo(d As Double)   '' No warning, Shadows suppresses it
    End Sub
End Class

Sub Main()
    Dim obj = New Derived
    obj.foo()          '' Error!
    Dim base As Base = obj
    base.foo()         '' Okay
End Sub

请注意,这只是一个警告,它不是错误。它只是预示着您将对客户端代码程序员造成的潜在痛苦。您可以轻松隐藏警告,将 Shadows 关键字放在Load()方法的前面。但当然要考虑避免客户端代码中的痛苦和痛苦,只需选择另一个名称,这样就不会有歧义。