2010-02-23 2 views
2

Учитывая этот пример:Как получить подкласс объекта?

Public Class Car 
End Class 

Public Class Vovlo 
    Inherits Car 
End Class 

Public Class BMW 
    Inherits Car 
End Class 

Когда я получаю объект автомобилей, как я могу определить, является ли объект автомобиля является Вольво, БМВ или автомобиль?

Я знаю, что могу использовать TypeOf, но когда есть несколько классов, которые наследуются от класса Car, это становится несколько громоздким.

Edit:

Это то, что я хочу для того чтобы достигнуть:

Public Sub DoSomething() 
     Dim subClassCar As Car.SubClass = DirectCast(car, Car.SubClass) 
    End Sub 

где Car.CubClass является либо Volvo или BMW, если объект автомобиль имеет подкласс, или автомобиль, если он не имеют подкласс. Проблема в том, как получить Car.SubClass.

+1

Не могли бы вы привести пример кода (где вы хотите принять какое-либо действие на основе автомобиля TypeOf объект прошел)? – shahkalpesh

+0

И что вы хотите сделать с переменной 'subClassCar' внутри' DoSomething'? – shahkalpesh

ответ

1

Есть только два упомянутых варианта: вы модифицируете базовый класс, чтобы иметь виртуальный метод DoSomething и переопределять его в подклассах (вы можете иметь функциональность по умолчанию в базовом классе, t должен быть абстрактным), или вы пишете большой условный оператор (я бы ДЕЙСТВИТЕЛЬНО не рекомендовал этого, идет против ООП)

2

TypeOf() это лучший способ - я полагаю, действие, которое вы хотите взять будет выглядеть примерно так:

если (MyObject является Volvo), то йоЗотеЬЫпд(); еще если (MyObject - BMW), то doSomething(); конец, если

Если метод, который вы хотите выполнить, уже находится в BMW или Volvo, вам не нужно проверять тип, потому что вы знаете, что будете в правильном классе. Если способ выполнить и принять меры, основанный на типе автомобиля, находится в базовом классе Car, тогда вам нужно будет выполнить вышеуказанную проверку типов, но вам нужно будет сделать это только в базовом классе, а не в каждом производном класс.

+0

Мне известно о TypeOf(), но когда есть несколько (> 100) классов, которые наследуют объект Car, это большая работа, и код станет беспорядочным. – eflles

+1

Извините, я до сих пор не понимаю, чего вы на самом деле хотите достичь. Если ваш метод «DoSomething» должен действовать по-разному в зависимости от типа автомобиля, который он задает, тогда создайте его как унаследованный метод - например, DoSomething на базовом классе Car, затем метод DoSomething для каждого из отдельных классов. Когда вы назовете DoSomething на Volvo, он будет использовать метод DoSomething от Volvo. Этот метод не требует проверки типа объекта, потому что, если он определен в Volvo, объектом является Volvo. –

1

Это что-то вы действительно хотите избежать. Вы делаете это, добавляя виртуальные методы в базовый класс. Подробнее обсуждали в this article.

+0

Я знаю, что это не лучший способ сделать что-то, но я не могу перепроектировать базу кода. – eflles

+0

Тогда не используйте наследование, используйте инкапсуляцию. –

Смежные вопросы