Я решил запустить Visual Studio и провести некоторое тестирование, потому что мои комментарии к другим ответам, вероятно, не будут иметь большого смысла. Предполагая, что у вас есть следующие классы:
Public Class Vehicle
Public Property Model As String
Public Property Make As String
End Class
Public Class Truck : Inherits Vehicle
Public Property IsFlatbed As Boolean
End Class
Public Class Car : Inherits Vehicle
Public Property LeatherSeats As Boolean
End Class
Вы также можете иметь следующие методы в другом классе:
Private Sub WhichVehicle()
Select Case cmbVehicle.SelectedItem
Case Truck
v = New Truck
Case Car
v = New Car
End Select
SetFlat(v)
End Sub
Private Sub SetFlat(ByVal myVehicle As Vehicle)
If TypeOf myVehicle Is Car Then
Debug.WriteLine("This is a car")
Dim c As Car = DirectCast(myVehicle, Car)
c.LeatherSeats = False
ElseIf TypeOf myVehicle is Truck Then
Debug.WriteLine("This is a truck")
Dim t As Truck = DirectCast(myVehicle, Truck)
t.IsFlatbed = True
End If
End Sub
Таким образом, это позволяет вам обходить объект транспортного средства так, как вы этого хотели, потому что вы не будете знать во время выполнения, с каким конкретным типом транспортного средства вы имеете дело (автомобиль или грузовик). Метод SetFlat может определить во время выполнения, в каком конкретном подклассе транспортного средства он был пройден, и действовать соответственно. Вам просто нужно убедиться, что вы приводите общий объект транспортного средства (v) к новому объекту более определенного подкласса после того, как вы определили, какой это тип подкласса (c для Car или t для Truck ), иначе код не будет скомпилирован, потому что вы пытаетесь вызвать метод, который не существует для общего типа транспортного средства, но только для определенных подтипов транспортных средств.
Самым большим недостатком этого подхода является то, что он может стать утомительным, если у вас много кода. Это потому, что каждый метод, который вы хотите вызвать, должен будет проверить, какой тип конкретного объекта транспортного средства был передан, и запустить другой набор подпрограмм в зависимости от этого конкретного типа.