2017-02-10 1 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 

InheritsFromはインスタンスメソッドであるように見えるので、表現obj.InheritsFrom(TSomeClass)は、おそらく少し混乱して

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

として実装されています。実際にはInheritsFromはクラスメソッドであり、ランタイムクラスobjInheritsFromSelfポインタとして渡されます。

基本的にisInheritsFromは、少なくとも注意をクラスに限定するときは同じタスクを実行します。 isがより一般的であり、たとえばインタフェースなどでも使用できることに注意してください。

明らかな構文上の違いがあります。すなわち、isにはインスタンスが必要ですが、InheritsFromはクラス関数です。これまでのように、Delphi言語はインスタンス参照でクラス関数を呼び出すことをサポートしています。もう1つの違いは、isnilリファレンスの組み込みテストがあることです。

これらは単なる構文上の違いですが、基本的な操作は同じです。isInheritsFromを呼び出していることからもわかります。

6

はい、違いがあります。 InheritsFromはクラス関数であり、その主な目的はクラスIS(あるクラスから継承)かどうかをテストすることです。

クラスにis演算子を使用することはできません。

TMyChildClass is TMyClassはコンパイルされませんが、代わりにTMyChildClass.InheritsFrom(TMyClass)を使用できます。

+0

両者に若干の違いがありますが、類似点があることを無視してはいけません。 – Fero

+0

その意味で私は同じ結果を達成できるいくつかのシナリオを意味します! – Fero

関連する問題