2

なぜ基本インターフェイスタイプの変数にクラスを割り当てることができません。基本インターフェイスタイプの変数にTMyClassオブジェクトを割り当てることができません

IInt1 = interface 
    procedure Test1; 
end; 

IInt2 = interface(IInt1) 
    procedure Test2; 
end; 

TCustomClass = class(TInterfacedObject) 
end; 

TMyClass = class(TCustomClass, IInt2) 
    procedure Test1; 
    procedure Test2; 
end; 

var 
    Obj: IInt1; 
begin 
    Obj := TMyClass.Create; // <!-- E2010 Incompatible types: 'IInt1' and 'TMyClass' 
    ... 
end; 


E2010 Incompatible types: 'IInt1' and 'TMyClass' 

はコンパイラのバグまたは単に不可アクションこのです:

たちは以下の持って考えてみましょう。これを回避することはできますか?

答えて

2

はあなたの宣言の中で実装されたインタフェースのリストでIInt1含める:

TMyClass = class(TCustomClass, IInt1, IInt2) 
end; 
+0

次のようになります。インターフェイスの継承は、唯一のインタフェースです。クラスは、実装するインタフェースを明示的に指定する必要があります。これは方法と関係があり、異なるインタフェースバージョン(お互いから派生するもの)が照会されます。 –

0

次のように3つのエラーは、上記あります

  1. クラス宣言は、インタフェースに必要なすべてのメンバーが含まれている必要があります。したがって、TMyClassは、プロシージャTest1とTest2を定義しなければなりません。
  2. 以下のコードに示すように、インターフェイスにはGUIDが必要です。 GUIDを表示する場所にカーソルを置き、CTRL-SHIFT-Gを押してIDEを作成し、これを作成します。
  3. 新しいクラスを割り当てるときは、型キャストにASキーワードを使用する必要があります。

コードのあなたのスニペット、それゆえ、それに加えて、この

IInt1 = interface 
    ['{218BE5BB-0784-4E4A-923C-F1F1E116F38B}'] 
    procedure Test1; 
end; 

IInt2 = interface(IInt1) 
    ['{635D00B2-AC59-43A9-A7DB-660F53EBCDD8}'] 
    procedure Test2; 
end; 

TCustomClass = class(TInterfacedObject) 
private 
    procedure Test1; 
end; 

TMyClass = class(TCustomClass, IInt2) 
private 
    procedure Test2; 
end; 

... 

var 
    Obj: IInt1; 
begin 
    Obj := TMyClass.Create AS IInt1; 
    ... 
+2

インターフェイスにはGUIDは必要ありません。 QueryInterfaceメソッドを直接的または間接的( 'Supports')に使いたい場合や、COMインターフェイスが必要な場合にのみ必要です。したがって、通常、InterfaceにはGUIDがありますが、必須ではありません。さらに、ASオペレータは必要ありません。コンパイラは「型キャスト」を正しく行うことが十分に分かっています。 –

関連する問題