Я вижу 3 варианта: вы либо сделать свой FruitStand
родовое так:
Class FruitStand(Of TFruit As Fruit)
Public ReadOnly Property Contents As List(Of TFruit)
End Class
NotInheritable Class AppleCart
Inherits FruitStand(Of Apple)
End Class
Или вы разорвать отношения между FruitStand
и AppleCart
и вместо их вывода как из того же, недавно извлеченный базовый класс (я думаю, что это опрятные варианты):
MustInherit Class FruitStandBase(Of TFruit As Fruit)
Public ReadOnly Property Contents As List(Of TFruit)
End Class
NotInheritable Class FruitStand
Inherits FruitStandBase(Of Fruit)
End Class
NotInheritable Class AppleCart
Inherits FruitStandBase(Of Apple)
End Class
В обеих случаях я запечатанные производный AppleCart
, так как ни один тип, полученный из него, не сможет переопределить тип TFruit
. В тот момент в иерархии тип Contents
закрыт.
Наконец, вы можете использовать теневое изображение, чтобы изменить значение Contents
в более производных типах. Уловка: вы должны использовать ковариантную коллекцию для свойства вашего базового типа Contents
(что означает использование интерфейса только для чтения, такого как IReadOnlyList(Of Fruit)
или массив - в любом случае вы теряете возможность добавлять или удалять элементы):
Class FruitStand
Public ReadOnly Property Contents As IReadOnlyList(Of Fruit)
Public Sub New()
Me.New(New List(Of Fruit))
End Sub
Protected Sub New(contents As IReadOnlyList(Of Fruit))
Me.Contents = contents
End Sub
End Class
Class AppleCart
Inherits FruitStand
Public Shadows ReadOnly Property Contents As IReadOnlyList(Of Apple)
Get
Return CType(MyBase.Contents, IReadOnlyList(Of Apple))
End Get
End Property
Public Sub New()
MyBase.New(New List(Of Apple))
End Sub
End Class
Если AppleCart может содержать только Яблоки, зачем кому-то его бросать? – Plutonix
Вместо того, чтобы AppleCart унаследовал от FruitStand, возможно, интерфейс (например, 'IFruitVendor (of T)') будет делать то, что вы хотите. – Plutonix
Becuase SuperClass (FruitStand) возвращает список фруктов, а не список Apple. Таким образом, потребитель должен был бы бросить Фрут, возвращенный из перечислителя, в Apple, чтобы получить доступ к свойствам, характерным для Apple. Корзина Apple содержит только Яблоки, потому что она гарантирует, что в список будут добавлены только Яблоки. – rcp