2010-12-14 44 views
5

在Delphi中,給出如下:找出Delphi ClassType是否繼承自其他ClassType?

TFruit = class; 
TFruitClass = class of TFruit; 

TApple = class(TFruit); 

TRedApple = class(TApple); 

如果我有一個TFruitClass變量,我怎麼能找出它是否從TApple繼承?例如。說我有

var 
    FruitClass: TFruitClass; 
... 
FruitClass := TRedApple; 

我如何驗證FruitClass確實從TApple在這種情況下繼承?使用FruitClass is TApple僅適用於類實例。

+0

爲什麼? '斷言(FruitClass.InheritsFrom(TApple))' – 2010-12-14 19:43:21

回答

13

使用InheritsFrom:

if TApple.InheritsFrom(TFruit) then 
    ... 

您還可以使用

var 
    Fr: TFruitClass; 
    X: TObject; 
begin 
    if X.InheritsFrom(TFruit) then 
    Fr := TFruitClass(X.ClassType); 
end; 
+0

應該指出,運行時類型檢查往往是一種控訴,一種或多種面向對象編程的[原則](http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod) (通常是Liskov替代原則和開放/封閉原則的組合)被忽視。大衛應該考慮一個設計,它不要求來電者知道它所呼叫的'TFruit'的後代。 – 2010-12-15 14:01:55

+0

@codeelegance:儘管我完全同意你的意見,但總會有設計權衡。有時你只需要一個方法來接受任何TObject,以適應「接口」或允許var參數,並且仍然要確保傳入的實例是正確的類型。在這些情況下,雖然我通常把InheritsFrom放在一個斷言中...... – 2010-12-15 18:43:26

+0

NFI,但是這個答案是不正確的;) – PatrickvL 2010-12-16 07:32:38

0

我假設你通過FruitClass變量沿着一些方法,在這種情況下,你應該閱讀:

if FruitClass.InheritsFrom(TApple) then 

請注意,您甚至不需要測試nil,因爲InheritsFrom是一個類函數,因此n不需要分配自變量。

相關問題