Инициализация класса коллекции - PullRequest
4 голосов
/ 04 октября 2010

Есть ли способ инициализировать коллекцию классов унаследованных типов?

Например, вот мой код:

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

Что я делаю сегодня для сбора данныхэто:

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.

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

Ответы [ 3 ]

2 голосов
/ 19 октября 2010

Просто еще один вариант. Я, вероятно, передам список конструктору. Я также добавил дополнительный 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
1 голос
/ 19 октября 2010

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

Public Class Camrys
    Inherits List(Of CamryCar)

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

End Class
1 голос
/ 04 октября 2010

Кажется, вы ищете функцию в заводском стиле.

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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...