Warum? Neu deklarieren Dinge Schnittstellen zu implementieren ?! in VB.NET
-
05-07-2019 - |
Frage
ich in VB.NET v2 arbeiten
Ich habe eine Schnittstelle IMyInterface und diese Schnittstelle implementiert ein Verfahren MyMethod .
Ich habe ein Objekt MyObjectBase . Dieses Objekt enthält eine (gleiche) Methode MyMethod .
1) Wenn ich jetzt MyObject Inherits MyObjectBase Implements IMyInterface
muss ich neu zu definieren? (Schatten, gekröpft) MyMethod
in der MyObject
Klasse?
2) Was nun, wenn man statt der MyMethod
Methode Ich habe eine MyEvent
Ereignis
Danke.
Lösung
In VB.NET, müssen Sie manuell verknüpfen Ihre Schnittstellenvertrag mit Implementierungen. Haben Sie einen Blick auf das folgende Beispiel:
Interface MyInterface
Sub Foo()
End Interface
Class TestClass
Implements MyInterface
Public Sub Test() Implements MyInterface.Foo
Console.WriteLine("Test")
End Sub
Public Sub Foo()
Console.WriteLine("Foo")
End Sub
End Class
Dann haben Sie einen Blick auf den folgenden Code und dessen Ausgang:
Dim x As New TestClass()
x.Foo() ' Output: Foo '
Dim y As MyInterface = x
y.Foo() ' Output: Test '
Dies hat den Vorteil, dass eine Schnittstelle implementiert nicht Sie bei der Benennung Ihrer Funktion beschränken, wie Sie mögen . Der Nachteil ist, dass man sich ausdrücklich Klassenmethoden mit Ihren Interface-Deklarationen mit dem Implements
Schlüsselwort verknüpfen.
So viel über eine Erklärung. Nun lassen Sie mich zu Ihrem Problem erhalten: Da Sie nicht Button
IVisibleChanged implementieren machen können, können Sie so etwas tun:
Private Event MyVisibleChanged() Implements IVisibleChanged.VisibleChanged
Private Sub RethrowVisibleChanged() Handles MyBase.VisibleChanged
RaiseEvent MyVisibleChanged()
End Sub
MyBase
ist ein VB.NET Keyword an die übergeordnete Klasse verweisen. Ebenso im Fall von MyMethod
, können Sie
Private Sub MyInterfaceMethod() Implements IMyInterface.Method
MyBase.Method()
End Sub
Das mag unnötig zusätzliche Arbeit erscheinen, aber in einer Art und Weise, es macht Sinn: Button.VisibleChanged
und IVisibleChanged.VisibleChanged
könnten Ereignisse mit zwei völlig unterschiedliche Semantik sein, der nur den gleichen Namen haben passieren (schließlich Button
nicht implementieren IVisibleChanged
). Mit Ihrem Code erstellen Sie explizit eine Verbindung zwischen diesen beiden.
Andere Tipps
Es ist, weil Sie Ihr Kind Klasse implementieren, die Sie neu definieren müssen. Ich glaube, wenn man nur aus dem Basisfall erben, die ohnehin durchgeführt wird, werden Sie nicht haben, wenn Sie es nicht brauchen.