Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to override a property and return a derived type in VB.NET?

Consider the following classes representing an Ordering system:

Public Class OrderBase
    Public MustOverride Property OrderItem as OrderItemBase
End Class

Public Class OrderItemBase
End Class

Now, suppose we want to extend these classes to a more specific set of order classes, keeping the aggregate nature of OrderBase:

Public Class WebOrder
    Inherits OrderBase        

    Public Overrides Property OrderItem as WebOrderItem 
    End Property
End Class

Public Class WebOrderItem
    Inherits OrderItemBase
End Class

The Overriden property in the WebOrder class will cause an error stating that the return type is different from that defined in OrderBase... however, the return type is a subclass of the type defined in OrderBase. Why won't VB allow this?

like image 599
Casey Wilkins Avatar asked May 07 '10 17:05

Casey Wilkins


2 Answers

You can't do that - it's changing the signature defined on the base. To do what you are trying to do you need to use generics:

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

My Visual Basic is rusty so hopefully that is accurate...

like image 109
J Rothe Avatar answered Oct 21 '22 12:10

J Rothe


You cannot change the signature of your class upon overriding it. You can, however, return a derived type:

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

Alternatively, if you want to enforce the types more strictly, use generics with generic type constraints, as shown below:

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

Or do this if you don't want WebOrder to be a generic class as well:

Public Class WebOrder
    Inherits OrderBase(Of WebOrderItem)

    Public Overrides ReadOnly Property OrderItem() As WebOrderItem
        Get
            Return New WebOrderItem()
        End Get
    End Property
End Class
like image 27
Burg Avatar answered Oct 21 '22 10:10

Burg