說我有,做了功能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