簡體   English   中英

子接口的 Load(x) 函數隱藏父接口的 Load() 函數

[英]Child Interface's Load(x) function hides parent interface's Load() function

我有以下通用接口

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 中? 我能做些什么來解決這個問題? 我應該為我的函數分別命名嗎?

是的,這是語言設計師需要做出的基本選擇之一。 核心決策是當派生類具有與基類中的成員同名的成員時究竟應該發生什么。 這會隱藏繼承的基類成員,並使基類成員難以使用。 而且這是有風險的,一個無辜的維護更改可能會突然不再隱藏基本成員並破壞現有代碼。

C# 語言設計者選擇了“隱藏簽名”。 換句話說,只有當基方法具有完全相同的名稱完全相同的參數時,方法才會隱藏。 這是您習慣並希望在這些接口聲明中發生的事情。

而其他語言,如 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() 方法之前。 但當然要考慮避免客戶端代碼中的痛苦和痛苦,只需選擇另一個名稱,這樣就不會產生歧義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM