Переопределяет свойство «список базового класса» и возвращает «список дочернего класса» - PullRequest
1 голос
/ 19 октября 2010

У меня есть базовый класс (например, Class1), содержащий список другого базового класса (например, ClassA). Каждый дочерний класс первого базового класса (например, Class1AA, Class1AB, ..), содержащий список дочерних классов второго базового класса (например, ClassAA, ClassAB, ...)

Клиент никогда не должен знать, какой дочерний класс используется, тогда я не думаю, что могу использовать generic для своих базовых классов.

Я пытаюсь что-то подобное и многое другое, но я всегда получаю ошибки ..

Imports System.Collections.Generic

Public Class Client

    Public Sub DoAction(obj as Class1)
        For Each item as ClassA in obj.ItemList
        ...
        Next
    End Sub

End Class

Public MustInherit Class Class1
    Public MustOverride ReadOnly Property ItemList() As IList(Of ClassA)

End Class

Public Class Class1AA
    Inherits Class1

    Public Overrides ReadOnly Property ItemList() As IList(Of ClassA)
        Get
            Return New List(Of ClassAA)
        End Get
    End Property
End Class

Public Class Class1AB
    Inherits Class1

    Public Overrides ReadOnly Property ItemList() As IList(Of ClassA)
        Get
            Return New List(Of ClassAB)
        End Get
    End Property
End Class

Public Class ClassA

End Class

Public Class ClassAA
    Inherits ClassA

End Class

Public Class ClassAB
    Inherits ClassA

End Class

Спасибо за вашу помощь

1 Ответ

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

Для этого кода требуется общая ковариация, которой нет в VB.

В принципе нет никакой связи между List(Of Base) и List(Of Derived). В противном случае можно написать следующий код:

Dim a As New List(Of Base)()
a.Add(New Base())

Dim b As List(Of Derived) = a
''// Can’t work: b(0) doesn’t contain a `Derived` instance!
Dim x As Derived = b(0)

Однако вы можете просто вернуть List(Of ClassA) везде и поместить производные объекты в этот список.

...