假设我有一个在Vb.net中执行以下操作的功能
For i as decimal = 0 to mstrItems.count - 1
mstrItems.item(i).activate
next
我有这样的类,这两个类虽然具有不同的对象类型,但却具有激活功能。
我想按上面的方式迭代我的项目,让列表包含任何类型的对象,而不仅仅是一种特定类型,并且让不同的对象都以相同的方式执行激活功能,尽管它们是不同的对象类型。
干杯! 马丁
答案 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