どうして?インターフェイスを実装するために再宣言しますか?! VB.NETで
-
05-07-2019 - |
質問
VB.NET v2で作業しています
インターフェイス IMyInterface があり、このインターフェイスはメソッド MyMethod を実装しています。
オブジェクト MyObjectBase があります。このオブジェクトには、(同じ)メソッド MyMethod が含まれています。
1) MyObject Inherits MyObjectBase Implements IMyInterface
再定義が必要ですか? (シャドウ、オーバーライド) MyMethod
を MyObject
クラスに追加しますか?
2) MyMethod
メソッドの代わりに MyEvent
event がある場合はどうなりますか?
ありがとう。
解決
VB.NETでは、インターフェイスコントラクトを実装に手動で関連付ける 必要があります。次の例をご覧ください:
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
次のコードとその出力を見てください:
Dim x As New TestClass()
x.Foo() ' Output: Foo '
Dim y As MyInterface = x
y.Foo() ' Output: Test '
これには、インターフェースを実装することで、必要に応じて関数に名前を付けることを制限しないという利点があります。欠点は、 Implements
キーワードを使用して、クラスメソッドをインターフェイス宣言に明示的に関連付ける必要があることです。
説明については以上です。ここで問題に取りかかりましょう: Button
にIVisibleChangedを実装させることはできないので、次のようなことができます:
Private Event MyVisibleChanged() Implements IVisibleChanged.VisibleChanged
Private Sub RethrowVisibleChanged() Handles MyBase.VisibleChanged
RaiseEvent MyVisibleChanged()
End Sub
MyBase
は、スーパークラスを参照するVB.NETキーワードです。同様に、 MyMethod
の場合、次のことができます
Private Sub MyInterfaceMethod() Implements IMyInterface.Method
MyBase.Method()
End Sub
これは不要な余分な作業のように思えるかもしれませんが、ある意味では理にかなっています: Button.VisibleChanged
と IVisibleChanged.VisibleChanged
は2つのまったく異なるセマンティクスを持つイベントである可能性があり、ただ同じ名前を持っている人(すべての Button
は IVisibleChanged
を実装していない)。コードを使用して、これら2つの間に明示的に接続を作成します。
他のヒント
子クラスを実装するため、再定義する必要があります。とにかく実装されているベースケースから継承するだけであれば、不要な場合は不要になると思います。