2010-10-04 130 views
4

是否有办法让类继承类的集合被初始化?初始化集合类

例如,这里是我的代码:

Public Class CamryCar 
    Property Name As String = "Camry" 
    Property Color As String 
End Class 

Public Class RedCamry 
    Inherits CamryCar 
    Sub New() 
     MyBase.New() 
     Color = "Red" 
    End Sub 
End Class 

Public Class BlueCamry 
    Inherits CamryCar 
    Sub New() 
     MyBase.New() 
     Color = "Blue" 
    End Sub 
End Class 

我在做什么今天的colllection是:

Public Class Camrys 
    Property Cars As New List(Of CamryCar) From {New RedCamry, New BlueCamry} 
End Class 

但是这给了我的Cars额外的属性。

我也可以这样做:

Public Class Camrys 
    Inherits List(Of CamryCar) 
End Class 

我喜欢这个,因为我没有额外的属性来处理。但我可以通过RedCamryBlueCamry的对象找到一种方法来初始化该列表。

难道还有其他方法可以做到吗?

回答

2

只是另一种选择。我可能会将该列表传递给构造函数。我还添加了一个额外的Sub New(),它将通过反射初始化集合。

Imports System.Reflection 

Module Module1 

    Sub Main() 
     Dim camrys As New Camrys 

     For Each camry As CamryCar In camrys 
      Console.WriteLine(camry.Color) 
     Next 

     Console.ReadKey() 
    End Sub 

End Module 

Public Class Car 

End Class 

Public Class CamryCar 
    Inherits Car 
    Property Name As String = "Camry" 
    Property Color As String 
End Class 

Public Class RedCamry 
    Inherits CamryCar 
    Sub New() 
     MyBase.New() 
     Color = "Red" 
    End Sub 
End Class 

Public Class BlueCamry 
    Inherits CamryCar 
    Sub New() 
     MyBase.New() 
     Color = "Blue" 
    End Sub 
End Class 

Public Class Camrys 
    Inherits List(Of CamryCar) 

    Public Sub New(ByVal Camrys As List(Of CamryCar)) 
     MyBase.New() 

     For Each Camry As CamryCar In Camrys 
      Add(Camry) 
     Next 
    End Sub 

    Public Sub New() 
     MyBase.New() 
     InitializeCamrys() 
    End Sub 

    Public Sub InitializeCamrys() 
     Dim asm As Assembly = Assembly.GetExecutingAssembly() 

     For Each t As Type In asm.GetTypes() 
      If GetType(CamryCar) Is t.BaseType Then 
       Dim camry As CamryCar = Activator.CreateInstance(t) 
       Add(camry) 
      End If 
     Next 
    End Sub 

End Class 
+0

+1用于使用反射自动添加所有版本的CamryCar。 – awe 2010-10-20 08:13:52

+0

谢谢。我认为这很聪明。 :) – 2010-10-20 14:21:31

+0

辉煌!谢谢。 – Stan 2010-10-20 17:15:36

1

看起来你正在寻找工厂风格的功能。现在

Module Factory 

    Public Function CreateCamrysList As List(of CamryCar) 
    Return New List(Of CamryCar) From {New RedCamry, New BlueCamry} 
    End Function 

End Module 

只要您需要CamryCar对象列表,你可以使用函数CreateCamrysList

注:List(Of T)导出通常是一个不好的解决方案。如果你确实需要推导出更好的选择Collection(Of T)

+2

出于好奇,为什么从List(Of T)得出一个不好的解决方案? – Stan 2010-10-05 04:21:27

1

你需要在构造函数初始化:

Public Class Camrys 
    Inherits List(Of CamryCar) 

    Public Sub New() 
     MyBase.New() 
     Add(New RedCamry()) 
     Add(New BlueCamry()) 
    End Sub 

End Class