0

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

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

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

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

干杯! 马丁

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

为了给您一些可搜索的术语,您要做的是使用多态性来利用Strategy Pattern

在最简单的情况下,您想要的是有一个基类(可能是抽象的,尽管我不知道这些东西的 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

等等。这个想法是你试图完成一件常见的事情(Drive在这种情况下),但多个不同的实现会以不同的方式完成它。但是由于所有这些实现仍然是 aCar那么你可以这样对待它们(这就是多态性的来源)。

因此,您可以拥有一个包含两者的组合列表,而不是拥有一个列表GasPoweredCar和一个列表。您无需知道它是什么类型的汽车即可简单地调用该函数。SolarPoweredCarCarDrive

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

Davids 出色答案的替代方法是使用接口。

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

interface ICar { void Drive(); }.

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

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

于 2012-07-03T05:31:20.243 回答
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 回答