假设我有一个在 Vb.net 中执行以下操作的函数
For i as decimal = 0 to mstrItems.count - 1
mstrItems.item(i).activate
next
而且我有这样的类,这两个类虽然不同的对象类型,但都具有激活功能。
我想像上面那样迭代我的项目,让列表包含任何类型的对象,而不仅仅是一种特定类型,并且让不同的对象都以相同的方式执行激活功能,尽管它们是不同的对象类型。
干杯! 马丁
假设我有一个在 Vb.net 中执行以下操作的函数
For i as decimal = 0 to mstrItems.count - 1
mstrItems.item(i).activate
next
而且我有这样的类,这两个类虽然不同的对象类型,但都具有激活功能。
我想像上面那样迭代我的项目,让列表包含任何类型的对象,而不仅仅是一种特定类型,并且让不同的对象都以相同的方式执行激活功能,尽管它们是不同的对象类型。
干杯! 马丁
或者,您可以定义一个接口并在所有不同的类型中实现它:
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
为了给您一些可搜索的术语,您要做的是使用多态性来利用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
和一个列表。您无需知道它是什么类型的汽车即可简单地调用该函数。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
Davids 出色答案的替代方法是使用接口。
GasPoweredCar 和 SolarPoweredCar 类可以实现一个接口:
interface ICar { void Drive(); }
.
这两个类都有自己的 Drive 方法的内部实现。然后,当迭代燃气或太阳能汽车时,您可以将类强制转换为接口并调用方法。
如果大卫的不理想,我很乐意详细说明,请告诉我。
多态性的替代方法是使用接口:
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