2010-10-04 3 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 

Я предпочитаю эту, как я не имею дополнительное свойство, чтобы иметь дело с. Но я могу найти способ инициализировать этот список с объектами RedCamry и BlueCamry.

Невозможно или есть другой способ сделать это?

ответ

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

+0

Спасибо. Я думал, что это умно. :) –

+0

Блестящий! Спасибо. – Stan

1

Кажется, что вы ищете функцию фабричного стиля.

Module Factory 

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

End Module 

Теперь вы можете использовать функцию CreateCamrysList везде, где требуется список CamryCar объектов.

Примечание: Получение от List(Of T), как правило, является плохим решением. Если вам нужно вывести, лучше выбрать Collection(Of T).

+2

Из любопытства, почему происходит от 'List (Of T)' плохое решение? – Stan

1

Вы должны инициализировать его в конструкторе:

Public Class Camrys 
    Inherits List(Of CamryCar) 

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

End Class 
Смежные вопросы