2

2つの別々のクラスがあります(A = BevelButtomのサブクラス、B = PushButtonのサブクラス)。AとBはどちらも、まったく同じ方法で多数の同一のメソッドを実装しています。両方のサブクラスのスーパークラスが異なり、RBは多重継承をサポートしていないため、これらのメソッドを結び付けるためにできることは、クラスインターフェイスを定義し、両方のサブクラスにインターフェイスを実装させてから、各サブクラスのメソッド本体をコピーして貼り付けることだけです。

それは私の感性を傷つけます。RBにこの共通論理を他の場所に抽出する方法はありますか?

ありがとう!

4

2 に答える 2

3

モジュール メソッドからのExtends構文を使用して、クラス インターフェイスを拡張します。クラス インターフェイスを使用する必要はありますが、この方法では、複数のクラス間で複製する代わりに、すべての共通コードをモジュールに配置できます。

Interface FooInterface
  Sub Foo()
End Interface

Class Foo
Implements FooInterface
  Sub Foo()
    MsgBox("Foo!")
  End Sub
End Class

Class Bar
Implements FooInterface
  Sub Foo()
    MsgBox("Bar!")
  End Sub
End Class

Module FooExtensions
  Sub Foobar(Extends FooImplementor As FooInterface)
    MsgBox("Foobar!")
  End Sub
End Module

上記の FooBar メソッドは、FooInterface クラス インターフェイスを実装する任意のクラスのクラス メソッドのように呼び出されます。

Dim myfoo As FooInterface = New Bar
myfoo.Foobar()

拡張メソッドは、指定されたクラスがインターフェイスを満たすかどうかをコンパイラが判断するときにカウントされないことに注意してください。

ただし、拡張メソッドは実際のクラスではなくインターフェイスにしかアクセスできないため、これは機能しない場合があります。

または、クラスを拡張することもできますがRectControl、これには PushButton と BevelButton だけでなく、すべてのデスクトップ コントロールが含まれます。

3 番目のオプションは、BevelButton クラスのみを使用することです。

于 2013-01-04T06:47:07.853 に答える
2

インターフェイスを使用するのは正しいアプローチのように思えますが、メソッド本体を各サブクラスにコピーするよりも、共通コードを使用して新しいクラス (CommonButtonStuff など) を作成する方が理にかなっていると思います。次に、実装されたメソッドでそれを呼び出すことができます:

CommonButtonInterface
  Sub Method1

Class CommonButtonHandler
  Sub DoMethod1
    MsgBox("Do it!")
  End Sub

Class A Inherits From PushButton, Implements CommonButtonInterface
  Private Property mCommonStuff As CommonButtonHandler

  Sub Constructor
    mCommonStuff = New CommonButtonHandler
  End Sub

  Sub Method1
    mCommonStuff.DoMethod1
  End Sub

Class B Inherits From BevelButton, Implements CommonButtonInterface
  Private Property mCommonStuff As CommonButtonHandler

  Sub Constructor
    mCommonStuff = New CommonButtonHandler
  End Sub

  Sub Method1
    mCommonStuff.DoMethod1
  End Sub
于 2013-01-04T15:42:36.510 に答える