2009-01-12 73 views
11

我對此感到震驚。有人可以解釋爲什麼這有效嗎?什麼時候使用它的一個很好的例子也會很好。使用vb.net中的私有方法實現接口

Public Interface IFoo 
    Sub DoIt() 
End Interface 

Public Class Bar 
    Implements IFoo 

    Private DoIt() implements IFoo.DoIt 
End Class 

... 

Dim b as new Bar() 
b.DoIt() 'error 
CType(b, IFoo).DoIt() 'no error 
+1

因此,代碼的作品?我很驚訝。看起來與接口的想法非常相反。 – jcollum 2009-01-12 17:48:35

回答

11

擁有一個私有接口實現基本上只是允許你實現一個接口,而不必渾濁你的類的API。您可以實施IFoo,但只有將您視爲IFoo的API才需要知道。

MSDN

可以使用私有成員實現接口成員。當私有成員實現接口的成員時,該成員即使不能直接在類的對象變量上使用,也可以通過接口獲得。

6

我被這種震撼。有人可以解釋爲什麼這有效嗎?什麼時候使用它的一個很好的例子也會很好。

這個概念非常類似於C#的顯式接口實現。在那裏,你也只能訪問接口的成員,如果你明確地將該類型轉換爲該接口。

我不能評論爲什麼 .NET框架團隊覺得這個功能是非常必要的。它有時可能會加強封裝,但我不確定這一點。無論如何,使用組合而不是(接口)繼承的東西總是可能的。

+0

當成員是「private」時,它與C#的顯式接口實現具有相同的用途,並且具有基本相同的語義(C#顯式將等同於具有唯一隨機私有名稱的vb樣式私有實現)。當使用Protected Overridable功能實現接口時,vb方法的最大好處就來了。然後派生類可以實現父接口的實現,這在C#中是不可能的,不會增加額外的間接級別。 – supercat 2012-02-01 22:48:38

2

該問題的第一部分已在其他帖子中介紹過,但我沒有看到一個示例。在實現泛型接口和非泛型對象時,我通常會使用它。例如,如果我想創建一個通用的ObservableList,我想要實現兩個IList接口。

Public Class ObservableList(Of T) 
    Implements INotifyCollectionChanged, 
       IList, 
       IList(Of T) 
End Class 

當兩個IList都實現時,我們會得到很多重複函數。一些共享相同的簽名,並可以實現清晰等IList功能。但是一些非泛型函數處理對象而不是泛型。所以對於Add函數,我會讓這兩個實現都能正常工作,但將非通用版本設置爲private,以便使用該類更容易。

Public Sub Add(item As T) Implements System.Collections.Generic.ICollection(Of T).Add 
    'Add item to collection 
End Sub 

Private Function Add1(item As Object) As Integer Implements System.Collections.IList.Add 
    'Add item to collection 
End Function 

這樣,類可以被傳遞並用作一個IList,但編碼器獲得,而不可能過載雜波用它作爲一個IList(OF T)。

相關問題