2017-02-10 47 views
4

在我能記得所有的情況下,下面的說明給出相同的結果:InheritsFrom和is運算符有什麼區別?

type 
    TMyClass = class(TObject); 
    TMyChildClass = class(TMyClass); 

var 
    MyObj : TMyChildClass; 

procedure TForm1.Test(); 
var 
    ResultA : Boolean; 
    ResultB : Boolean; 
begin 
    //Using TObject.InheritsFrom 
    ResultA := MyObj.InheritsFrom(TMyClass); 

    //Using 'is' operator 
    ResultB := MyObj is TMyClass; 

    //Showing results 
    ShowMessage(
    'InheritsFrom = ' + BoolToStr(ResultA, True) + sLineBreak + 
    'is = ' + BoolToStr(ResultB, True) 
); 
end; 

有沒有在使用,而不是TObject.InheritsFrom功能is運營商一定的差異?

回答

4

is運營商建立在InheritsFrom之上。所以,

obj is TSomeClass 

實現爲

(obj <> nil) and obj.InheritsFrom(TSomeClass) 

表達obj.InheritsFrom(TSomeClass)也許是有點混亂,因爲它看起來像InheritsFrom是一個實例方法。實際上,InheritsFrom是一個類方法,而obj的運行時類作爲Self指針傳遞給InheritsFrom

因此,基本上isInheritsFrom執行相同的任務,至少在限制對類的關注時。請注意,is更通用,例如也可以與接口一起使用。

有明顯的語法差異。即is需要一個實例,而InheritsFrom是一個類函數。儘管如我們所見,Delphi語言確實支持在實例引用上調用類函數。另一個明顯的區別是isnil引用有內置測試。

雖然這些只是語法上的差異,但其基本操作是相同的,is稱爲InheritsFrom

6

是的,有區別。 InheritsFrom是類函數,它的主要用途是測試類IS(繼承自某個類)。

您不能在類上使用is運算符。

TMyChildClass is TMyClass不會編譯,但您可以使用TMyChildClass.InheritsFrom(TMyClass)來代替。

+0

即使兩者有細微差別,我們也不應該忽視它們確實有相似之處。 – Fero

+0

從這個意義上說,我的意思是在某些情況下他們可以達到相同的結果! – Fero

相關問題