Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Passing Base Object Type When Using Inherited One

Tags:

oop

vb.net

I have a project that has mainly two objects, both inheriting from a base. Like this:

Public Class Vehicle
    Property Model As String
    Property Make As String
End Class

Public Class Truck
    Inherits Vehicle
    Property IsFlatbed As Boolean
End Class

Public Class Car
    Inherits Vehicle
    Property LeatherSeats As Boolean
End Class

Simple enough, eh? Because I don't know if a user will choose car or truck, what I would like to do is just pass around Vehicle.

So, something like this:

Public v As Vehicle
Sub WhichVehicle()
    Select Case cmbVehicle.SelectedItem
        Case Truck
            v = New Truck
        Case Car
            v = New Car
    End Select
    SetFlat (v)
End Sub

This all works, but now I just want to pass v around and use it's properties. Like:

Sub SetFlat (myVehicle As Vehicle)
    myVehicle.IsFlatbed = True
End Sub

The above function doesn't work because myVehicle is a Vehicle, not a Truck.

Is there a way I can pass around a Vehicle type and have the IDE know which type to use? Or am I completely missing a better way to do this?

like image 494
Stan Avatar asked Jan 22 '23 07:01

Stan


1 Answers

Basically when you call SetFlat you know your vehicle has a property named IsFlatbed, right?

Then you should declare an interface Flattable which includes this property. The class Truck would implement that interface, and the SetFlat sub would have a Flattable object as a parameter instead of a vehicle.

Edit:

What about this:

Public Interface IFlattable
    Property IsFlatbed() As Boolean
End Interface

Public Class Truck
    Inherits Vehicle
    Implements IFlattable

    Private _isFlatBed as Boolean
    Public Property IsFlatbed() as Boolean Implements IFlattable.IsFlatbed
        Get
            Return _isFlatbed
        End Get
        Set(ByVal value as Boolean)
            _isFlatbed = value
        End Set
End Class


Public v As Vehicle
Sub WhichVehicle()
    Select Case cmbVehicle.SelectedItem
        Case Truck
            v = New Truck
            SetFlat (DirectCast(v, IFlattable))
        Case Car
            v = New Car
    End Select
End Sub

Sub SetFlat (myVehicle As Flattable)
    myVehicle.IsFlatbed = True
End Sub
like image 118
GôTô Avatar answered Feb 11 '23 07:02

GôTô