0

Vb.netで次のことを行う関数があるとします

For i as decimal = 0 to mstrItems.count - 1
  mstrItems.item(i).activate
next

そして、オブジェクトタイプは異なりますが、両方のクラスが関数をアクティブにするようなクラスを持っています。

上記のようにアイテムを反復処理し、特定の 1 つのタイプだけでなく、任意のタイプのオブジェクトをリストに含め、さまざまなオブジェクトがすべて同じ方法でアクティブ化機能を実行するようにしますが、それらは異なるオブジェクト タイプです。

乾杯!マーティン

4

4 に答える 4

4

または、インターフェイスを定義して、すべての異なるタイプに実装することもできます。

Interface IActivateable
  Sub Activate
End Interface

Class MyType1: Implements IActivateable
Sub Activate Implements IActivateable.Activate
'some implementation details here ...
End Sub
End Class

Class MyType2: Implements IActivateable
Sub Activate Implements IActivateable.Activate
'some implementation details here ...
End Sub
End Class

次に、処理するインターフェイスとして各タイプをキャストできます。

 Dim myList as new list(of IActivateable)
 myList.add(new MyType1)
 myList.add(new MyType2)

 for each obj as IActivateable in myList
     obj.Activate
 end for
于 2012-07-03T05:30:30.130 に答える
3

検索可能な用語を提供するために、あなたが探しているのは、ポリモーフィズムを使用して戦略パターンを利用することです。

最も単純な場合、必要なのは、複数のクラスが継承する基本クラス(おそらく抽象的ですが、これらのVB用語はわかりません)を持つことです。これは、これらのクラス間の共通の機能を表す一種の高レベルの抽象化です。このようなもの:

Class Car
    Overridable Sub Drive()
        Throw New NotImplementedException
    End Sub()
End Class

Class GasPoweredCar
    Inherits Car
    Overrides Sub Drive()
        ' logic for driving a gas-powered car
    End Sub
End Class

Class SolarPoweredCar
    Inherits Car
    Overrides Sub Drive()
        ' logic for driving a solar-powered car
    End Sub
End Class

等々。(この場合)達成しようとしている共通のことが1つありますDriveが、複数の異なる実装が異なる方法でそれを達成するという考え方です。しかし、これらの実装はすべてまだCarその時点であるため、それらをそのように扱うことができます(これがポリモーフィズムの出番です)。

したがって、GasPoweredCarとのリストを作成する代わりに、両方を含むSolarPoweredCar単一の結合リストを作成できます。関数を呼び出すだけで、車の種類Carを知る必要はありません。Drive

For i As decimal = 0 To listOfCars.count - 1
    listOfCars.Item(i).Drive
Next

またはもっと簡単に:

For Each car As Car In listOfCars
    car.Drive
Next
于 2012-07-03T05:20:34.847 に答える
1

ポリモーフィズムに代わる方法は、インターフェイスを使用することです。

Module Module1

    Sub Main()
    Dim lstClass As New List(Of IMyInterface)
    lstClass.Add(New FirstClass("A"))
    lstClass.Add(New SecondClass("B"))
    lstClass.Add(New FirstClass("C"))
    lstClass.Add(New SecondClass("D"))

    For i As Integer = 0 To lstClass.Count - 1
      lstClass(i).Activate()
    Next i
  End Sub

  Interface IMyInterface
    Sub Activate()
  End Interface
  Class FirstClass
    Implements IMyInterface

    Public Property MyProperty As String
    Sub New(s As String)
      MyProperty = s
    End Sub

    Sub Activate() Implements IMyInterface.Activate
      MsgBox("First class activate: " & MyProperty)
    End Sub
  End Class

  Class SecondClass
    Implements IMyInterface
    Public Property MyProperty As String
    Sub New(s As String)
      MyProperty = s
    End Sub

    Sub Activate() Implements IMyInterface.Activate
      MsgBox("Second class activate: " & MyProperty)
    End Sub
  End Class

End Module
于 2012-07-03T05:33:38.153 に答える
1

Davidsの優れた答えに代わるものは、インターフェイスを使用することです。

GasPoweredCar および SolarPoweredCar クラスは、インターフェースを実装できます。

interface ICar { void Drive(); }.

どちらのクラスにも、Drive メソッドの独自の内部実装があります。次に、ガス車またはソーラー車を反復処理するときに、クラスをインターフェイスにキャストしてメソッドを呼び出すことができます。

David's が理想的でない場合は、詳しく説明させていただきます。お知らせください。

于 2012-07-03T05:31:20.243 に答える