2014-05-09 35 views
0

假設我有一個名爲SuperClass的類和一個名爲​​的類。​​從SuperClass延伸。在SuperClass的定義裏面,我有一個方法,試圖檢查this類是否爲​​的一個實例。正確的方法來查看超類的當前實例是否是超類內的子類

if (this.GetType() == typeof(SubClass)) 
    log.Info("This SuperClass is a SubClass"); 
else 
    log.Info("This SuperClass is NOT a SubClass"); 

這有效,但我總是非常懷疑,當某些工作正常(特別是在第一次嘗試)。我想確保這是最好的方式(最安全,最可讀,正確)做我想做的事。

+0

假設還有一個'OtherSub:SuperClass'。你真的問「這是一個」子類「嗎?」或「這完全是一個'SuperClass',而不是它的任何部分?」 –

+1

必須做這樣的檢查意味着您可能在某個地方的類結構中存在設計問題。這些類的設計應該使基類不需要知道它的子類。 –

回答

4

我認爲你只是在尋找is operator

if (this is SubClass) 

特別是,也將繼續,如果this是​​一個子類的實例。

如果您然後想要使用this作爲​​,例如,獲得在​​聲明的成員,你應該考慮as operator太:

SubClass sub = this as SubClass; 
if (sub != null) 
{ 
    // Use sub here 
} 

如果要檢測this實例正是​​(而不是進一步派生類型),然後檢查你」已經得到了已經是正確的。

警告一句話:在執行時需要檢查類型通常是一種設計氣味。考慮是否有其他方法可以實現您的目標。有時候(例如,通過在基類中引入一個新的虛擬或抽象成員),有時候不會......但它總是值得思考。

2

這會工作,但你已經結合你的超級和子類,超級真的不應該知道子。在超類上創建一個虛擬方法,子類將會覆蓋以執行實際工作。你可以從超類的內部或外部調用這個方法來完成你需要的工作。如果工作需要在超類的成員上完成,那麼使其受到保護,以便子類可以訪問它們。

讓我補充說,幾乎任何時候你需要檢查一個對象的類型,你沒有做正確的面向對象編程,並有更好的設計被發現。通常它是需要做類型檢查類試圖完成的工作的子類。