2012-07-03 31 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