1

さて、私はこのようなシナリオを持っています。まず、インターフェイスがあります。これをIinterfaceと呼び、インターフェイスにはメソッドがあります(メソッドと呼びます)。これで、インターフェイスを実装するスーパークラスと、インターフェイスにメソッドを実装するメソッドができました。スーパークラスから継承するサブクラスがありますが、サブクラスでは、メソッドを最初に実装したスーパークラスのメソッドが、同じ名前と署名を持つ別のメソッドによってシャドウイングされています。

この場合、サブクラスは引き続きインターフェースを実装しますか?

具体的には、これは機能しますか?

Dim stuff as Iinterface
stuff = new SuperClass
'do some things
stuff = new SubClass

ありがとう!

4

2 に答える 2

0

はい、元のSuperClassメソッドは引き続きインターフェイスを実装しますが、元のSuperclassメソッドを使用します。署名が同じである場合は、シャドウの代わりにオーバーライドを使用します。同じ署名がない場合は、とにかくインターフェイスを実装できません。

Module Module1

  Sub Main()
    Dim myiTest As IMyInterface
    myiTest = New MySuperClass
    myiTest.MyMethod(1, "a")
    myiTest = New MySubClass
    myiTest.MyMethod(1, "a")
    myiTest = New MySubClass2
    myiTest.MyMethod(1, "a")
  End Sub


  Interface IMyInterface
    Sub MyMethod(a As Integer, b As String)
  End Interface

  Class MySuperClass
    Implements IMyInterface

    Public Overridable Sub MyMethod(a As Integer, b As String) Implements IMyInterface.MyMethod
      MsgBox("Original MyMethod")
    End Sub
  End Class

  Class MySubClass
    Inherits MySuperClass
    Public Shadows Sub MyMethod(a As Integer, b As String)
      MsgBox("Shadowed MyMethod")
    End Sub
  End Class

  Class MySubClass2
    Inherits MySuperClass
    Public Overrides Sub MyMethod(a As Integer, b As String)
       MsgBox("Overridden MyMethod")
    End Sub
  End Class
End Module
于 2012-07-02T04:25:31.657 に答える
0

コンパイラの警告を気にしない場合は、インターフェイスを(再び)明示的に実装するメソッドを使用できます。Shadows

Class MySubClass3
    Inherits MySuperClass
    Implements IMyInterface
    Public Shadows Sub MyMethod(ByVal a As Integer, ByVal b As String) Implements IMyInterface.MyMethod
        MsgBox("Shadowed re-Implemented MyMethod")
    End Sub
End Class

そして、警告が提供されたとしても、これはShadowsコンパイルされたままのメソッドです(したがって

    Dim mysTest As MySuperClass = New MySubClass3
    mysTest.MyMethod(1, "a")

引き続き「OriginalMyMethod」が表示されます)。この警告に関するMicrosoftの説明で説明されているように、メソッドの再実装を意図しているため、警告を無視するか、明示的に無効にする必要があります。

于 2012-07-02T05:57:08.913 に答える