2010-02-23 66 views
2

考慮這個例子:如何獲取對象的子類?

Public Class Car 
End Class 

Public Class Vovlo 
    Inherits Car 
End Class 

Public Class BMW 
    Inherits Car 
End Class 

當我收到一個Car對象,我怎麼能確定Car對象是沃爾沃,一輛寶馬或汽車?

我知道我可以使用TypeOf,但是當有幾個繼承自Car類的類時,這會變得有點麻煩。

編輯:

這是我想acheive什麼:

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

其中Car.CubClass要麼是沃爾沃,寶馬如果汽車對象有一個子類,或汽車,如果它不有一個子類。問題是如何獲得Car.SubClass。

+1

你能舉出一個代碼示例(你想根據TypeOf Car對象通過)? – shahkalpesh 2010-02-23 12:25:12

+0

然後你想在'DoSomething'裏面用變量'subClassCar'做什麼? – shahkalpesh 2010-02-23 13:14:00

回答

1

有真的只有兩個選擇中提到,無論是你修改基類有一個虛擬DoSomething的方法,並在子類中重寫它(你可以在基類的默認功能,沒有按」或者你寫一個大的條件語句(我真的不會推薦這個,不利於OOP)

2

typeof運算()是最好的方式 - 我想你想利用看起來像動作:

如果(myObject的是沃爾沃),然後 DoSomething的(); else if(MyObject is BMW)then doSomething(); 結束如果

如果您想要執行的方法已經在寶馬或沃爾沃,那麼您不需要進行任何類型檢查,因爲您知道您將會進入正確的班級。如果基於汽車類型執行和採取行動的方法在Car基類中,則需要執行上述類型檢查,但只需在基類中執行,而不是在每個派生類中執行類。

+0

我知道TypeOf(),但是當有幾個(> 100)繼承Car對象的類時,這是很多工作,並且代碼將變得混亂。 – eflles 2010-02-23 12:35:18

+1

對不起,我還不清楚你實際想要達到什麼。如果您的「DoSomething」方法根據所提供的Car類型採取不同的行爲,則將其作爲一種繼承方法進行創建 - 例如,在基類Car上做一些事情,然後在每個單獨的類上使用DoSomething方法。當您打電話給沃爾沃的DoSomething時,它會運行沃爾沃的DoSomething方法。該方法不需要檢查對象的類型,因爲如果它在沃爾沃中定義,則該對象是沃爾沃。 – 2010-02-23 13:40:35

1

這是你真的想要避免的東西。您可以通過向基類添加虛擬方法來實現這一點。更詳細的討論在this article.

+0

我知道這不是做事情的最佳方式,但我不能重新設計代碼庫。 – eflles 2010-02-23 12:40:52

+0

然後不要使用繼承,使用封裝。 – 2010-02-23 13:10:57