如何在同一个地方使用多个类类型

时间:2012-07-03 05:06:15

标签: vb.net

假设我有一个在Vb.net中执行以下操作的功能

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

我有这样的类,这两个类虽然具有不同的对象类型,但却具有激活功能。

我想按上面的方式迭代我的项目,让列表包含任何类型的对象,而不仅仅是一种特定类型,并且让不同的对象都以相同的方式执行激活功能,尽管它们是不同的对象类型。

干杯! 马丁

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

为了给您提供一些可搜索的术语,您要查看的是使用polymorphism来使用Strategy Pattern

最简单的,你想要的是拥有一个基类(可能是抽象的,我不知道这些东西的VB术语),你的multiple classes inherit。它是一种高级抽象,代表了这些类之间的共同功能。像这样:

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

等等。我们的想法是,您正在努力实现一个常见的事情(在这种情况下为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

答案 2 :(得分:1)

Davids的替代方案是使用Interfaces。

GasPoweredCar和SolarPoweredCar类可以实现一个接口:

interface ICar { void Drive(); }

这两个类都有自己的Drive方法内部实现。然后,当迭代Gas或Solar汽车时,您可以将类强制转换为接口并调用方法。

如果大卫不理想我很乐意详细说明,请告诉我。

答案 3 :(得分: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