2012-07-03 38 views
0

說我有,做了功能Vb.net我怎麼能在同一個地方使用多個類型

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

下面我有階級作爲兩個班,但不同的對象類型,有該功能激活。

我想迭代我的項目如上所述,讓列表包含任何類型的對象,不只是一種特定的類型,並且不同的對象都以相同的方式執行激活功能,儘管它們是不同的對象類型。

乾杯! Martin

回答

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 
+0

+1 - 你打我吧 –

+1

這樣,你也可以實現OOP設計的基本功能「程序到接口,而不是實現」:)(見http://en.wikipedia.org/wiki/Design_Patterns) –

+0

Bah你打敗了我。詛咒! – SSS

3

爲了給你一些可搜索的術語,你要做的是使用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 
+0

最好的,謝謝! – marscom

1

戴維斯優秀答案的替代方案是使用接口。

的GasPoweredCar和SolarPoweredCar類可以實現一個接口:

interface ICar { void Drive(); }

這兩個類都有自己的Drive方法的內部實現。然後,在迭代燃氣或太陽能汽車時,您可以將該課程投到界面並調用該方法。

如果大衛的不理想,我很樂意詳細說明,只是讓我知道。

+1

我剛剛實現了多態性及其工作,儘管它也很好地瞭解了接口:D,現在不需要詳細說明,因爲我現在也有一些答案:D – marscom

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