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不允许这样?
你不能这样做 - 它正在改变基础上定义的签名.要做你想做的事,你需要使用泛型:
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生锈了所以希望这是准确的......
您不能在重写类时更改其签名。但是,您可以返回派生类型:
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)