2009-01-12 13 views
11

Ich war irgendwie schockiert von diesem. Könnte jemand erklären, warum das funktioniert? Ein gutes Beispiel für den Einsatz wäre auch schön.implementieren Sie eine Schnittstelle mit einer privaten Methode in 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

So funktioniert dieser Code? Ich bin überrascht. Scheint der Idee einer Schnittstelle sehr entgegengesetzt. – jcollum

Antwort

11

Mit einer privaten Schnittstellenimplementierung können Sie im Grunde nur eine Schnittstelle implementieren, ohne die API Ihrer Klasse zu verschmutzen. Sie können IFoo implementieren, aber nur APIs, die Sie als IFoo behandeln, müssen dies wissen.

MSDN sagt

Sie ein eigenes Element verwenden können eine Schnittstelle Mitglied zu implementieren. Wenn ein privates Mitglied ein Mitglied einer Schnittstelle implementiert, wird dieses Mitglied über die Schnittstelle verfügbar, obwohl es nicht direkt für Objektvariablen für die Klasse verfügbar ist.

6

ich irgendwie durch diese war schockiert. Könnte jemand erklären, warum das funktioniert? Ein gutes Beispiel für den Einsatz wäre auch schön.

Dieses Konzept entspricht weitgehend der expliziten Schnittstellenimplementierung von C#. Auch dort können Sie nur auf das Member der Schnittstelle zugreifen, wenn Sie den Typ explizit auf diese Schnittstelle umwandeln.

Ich kann keinen Kommentar zu Warum das .NET-Framework-Team fühlte, dass diese Funktion wirklich notwendig war. Es könnte manchmal die Verkapselung verstärken, aber ich bin mir nicht sicher. In jedem Fall wäre etwas sehr Ähnliches immer möglich, wenn man Komposition anstelle von (Schnittstellen-) Vererbung verwendet.

+0

Wenn das Mitglied "privat" ist, dient es dem gleichen Zweck wie die explizite Schnittstellenimplementierung von C# und hat grundsätzlich die gleiche Semantik (ein explizites C# wäre äquivalent zu einer privaten Implementierung im Vb-Stil mit einem eindeutigen zufälligen privaten Namen). Der große Vorteil von vb liegt in der Implementierung von Schnittstellen mit "Protected Overridable" -Funktionen. Abgeleitete Klassen können dann die Schnittstelle in Bezug auf die Implementierung der Eltern implementieren, etwas, das in C# nicht möglich ist, ohne eine zusätzliche Ebene der Indirektion hinzuzufügen. – supercat

2

Der erste Teil der Frage wurde in anderen Posts behandelt, aber ich sah kein Beispiel. Ich verwende das häufig, wenn ich generische Interfaces und ihre nicht-generischen Gegenstücke implementiere. Wenn ich beispielsweise eine generische ObservableList erstellen möchte, möchte ich beide IList-Schnittstellen implementieren.

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

Wenn beide ILists umgesetzt werden wir am Ende mit einer Menge von doppelten Funktionen auf. Einige haben die gleiche Signatur und können beide IList-Funktionen wie Clear implementieren. Einige der nicht-generischen Funktionen behandeln jedoch Objekte anstelle von generischen. Also würde ich für die Add-Funktion beide Implementierungen arbeiten lassen, aber die nicht-generische Version als privat festlegen, um die Verwendung der Klasse zu vereinfachen.

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 

Auf diese Weise kann die Klasse übergeben und als IList verwendet werden, aber ein Programmierer wird es als IList zu verwenden (Of T) ohne die potenziellen Überlastung Unordnung.

Verwandte Themen