是否可以覆盖属性并在VB.NET中返回派生类型?

Cas*_*ins 8 vb.net inheritance overriding covariance

考虑以下表示订购系统的类:

Public Class OrderBase
    Public MustOverride Property OrderItem as OrderItemBase
End Class

Public Class OrderItemBase
End Class
Run Code Online (Sandbox Code Playgroud)

现在,假设我们想要将这些类扩展为更具体的订单类集,保持OrderBase的聚合性质:

Public Class WebOrder
    Inherits OrderBase        

    Public Overrides Property OrderItem as WebOrderItem 
    End Property
End Class

Public Class WebOrderItem
    Inherits OrderItemBase
End Class
Run Code Online (Sandbox Code Playgroud)

WebOrder类中的Overriden属性将导致错误,指出返回类型与OrderBase中定义的类型不同...但是,返回类型是OrderBase中定义的类型的子类.为什么VB不允许这样?

J R*_*the 8

你不能这样做 - 它正在改变基础上定义的签名.要做你想做的事,你需要使用泛型:

Public Class OrderBase(Of T As IOrderItem)
    Public ReadOnly Property OrderItems As IList(Of T)
End Class
Run Code Online (Sandbox Code Playgroud)

我的Visual Basic生锈了所以希望这是准确的......


Bur*_*urg 5

您不能在重写类时更改其签名。但是,您可以返回派生类型:

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
Run Code Online (Sandbox Code Playgroud)

或者,如果要更严格地强制类型,请使用具有泛型类型约束的泛型,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

如果您不希望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
Run Code Online (Sandbox Code Playgroud)