说我有,做了功能Vb.net我怎么能在同一个地方使用多个类型
For i as decimal = 0 to mstrItems.count - 1
mstrItems.item(i).activate
next
下面我有阶级作为两个班,但不同的对象类型,有该功能激活。
我想迭代我的项目如上所述,让列表包含任何类型的对象,不只是一种特定的类型,并且不同的对象都以相同的方式执行激活功能,尽管它们是不同的对象类型。
干杯! Martin
说我有,做了功能Vb.net我怎么能在同一个地方使用多个类型
For i as decimal = 0 to mstrItems.count - 1
mstrItems.item(i).activate
next
下面我有阶级作为两个班,但不同的对象类型,有该功能激活。
我想迭代我的项目如上所述,让列表包含任何类型的对象,不只是一种特定的类型,并且不同的对象都以相同的方式执行激活功能,尽管它们是不同的对象类型。
干杯! Martin
或者,你可以定义一个接口,并在所有不同类型的实现:
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
为了给你一些可搜索的术语,你要做的是使用polymorphism来使用Strategy Pattern。
最简单的,你想要的是从你的multiple classes inherit中得到一个基类(可能是抽象的,我不知道这些东西的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
),但多种不同的实现将以不同的方式完成它。但是,由于所有这些实现仍然是一个Car
,那么你可以将它们视为这样(这是多态性来的地方)。
因此,您可以有一个包含Car
的单一组合列表,而不是具有GasPoweredCar
列表和SolarPoweredCar
列表。您不需要知道汽车的种类它是为了简单地调用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
最好的,谢谢! – marscom
戴维斯优秀答案的替代方案是使用接口。
的GasPoweredCar和SolarPoweredCar类可以实现一个接口:
interface ICar { void Drive(); }
。
这两个类都有自己的Drive方法的内部实现。然后,在迭代燃气或太阳能汽车时,您可以将该课程投到界面并调用该方法。
如果大卫的不理想,我很乐意详细说明,只是让我知道。
我刚刚实现了多态性及其工作,尽管它也很好地了解了接口:D,现在不需要详细说明,因为我现在也有一些答案:D – marscom
多态另一种方法是使用一个接口:
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
+1 - 你打我吧 –
这样,你也可以实现OOP设计的基本功能“程序到接口,而不是实现”:)(见http://en.wikipedia.org/wiki/Design_Patterns) –
Bah你打败了我。诅咒! – SSS