Действительно ли возможно переопределить свойство и возвратить производный тип в VB.NET?

Рассмотрите следующие классы, представляющие Систему заказа:

Public Class OrderBase
    Public MustOverride Property OrderItem as OrderItemBase
End Class

Public Class OrderItemBase
End Class

Теперь, предположите, что мы хотим расширить эти классы до более определенного набора классов порядка, сохраняя совокупную природу OrderBase:

Public Class WebOrder
    Inherits OrderBase        

    Public Overrides Property OrderItem as WebOrderItem 
    End Property
End Class

Public Class WebOrderItem
    Inherits OrderItemBase
End Class

Свойство Overriden в классе WebOrder вызовет ошибку при указывании, что тип возврата отличается от определенного в OrderBase... однако, тип возврата является подклассом типа, определенного в OrderBase. Почему не будет VB позволять это?

8
задан Casey Wilkins 7 May 2010 в 18:10
поделиться

2 ответа

Вы не можете этого сделать - это меняет подпись, определенную на базе. Чтобы делать то, что вы пытаетесь сделать, вам нужно использовать дженерики:

Public Class OrderBase(Of T As IOrderItem)
    Public ReadOnly Property OrderItems As IList(Of T)
End Class

Мой Visual Basic заржавел, так что, надеюсь, это точно ...

8
ответ дан 5 December 2019 в 10:01
поделиться

Вы не можете изменить подпись вашего класса после ее отмены. Однако вы можете вернуть производный тип:

Public Overrides Property OrderItem() as OrderItemBase
    Get
        Return New WebOrderItem()
    End Get
End Property

Public Sub Whatever()
    Dim item As WebOrderItem = DirectCast(OrderItem, WebOrderItem)
End Sub

В качестве альтернативы, если вы хотите более строго применять типы, используйте универсальные типы с ограничениями универсального типа, как показано ниже:

Public MustInherit Class OrderBase(Of T As OrderItemBase)
    Public MustOverride ReadOnly Property OrderItem() As T
End Class

Public Class OrderItemBase
End Class

Public Class WebOrder(Of T As WebOrderItem)
    Inherits OrderBase(Of T)

    Public Overrides ReadOnly Property OrderItem() As T
        Get
            Return New WebOrderItem()
        End Get
    End Property
End Class

Public Class WebOrderItem
    Inherits OrderItemBase
End Class

Или сделайте это, если вы не хотите, чтобы WebOrder выполнял также быть универсальным классом:

Public Class WebOrder
    Inherits OrderBase(Of WebOrderItem)

    Public Overrides ReadOnly Property OrderItem() As WebOrderItem
        Get
            Return New WebOrderItem()
        End Get
    End Property
End Class
5
ответ дан 5 December 2019 в 10:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: