
Delphi 2010の機能の1つは、多くの論争を引き起こすと思われますが、このインターフェイスを実装するクラスのタイプにインターフェイスリンクをキャストできることです。
IMyInterfaceインターフェースと、このインターフェースを実装するTMyClassクラスがあると想像してみましょう。
IMyInterface = interface
[ '{7AD04980-5869-4C93-AC29-C26134511554}' ]
procedure Foo;
end;
TMyClass = class (TInterfacedObject, IMyInterface)
procedure Foo;
procedure Bar;
end;

私が見た最も一般的な解決策は、クラスの型を返すメソッドをインターフェイスに含めることですが、インターフェイスを特定の実装にバインドして、インターフェイスを最初に置く価値を破壊します。 また、それは嫌です。
そのような技術はもはや必要ありません。
Delphi 2010では、 is演算子を使用して、インターフェイスが特定のクラスによって実装されているかどうかを確認できます。実装されている場合は、そのクラスにキャストし、インターフェイス以外のメソッド、プロパティなどを使用します。
さらに、実際に取得されていないクラスの型にインターフェイス参照をキャストしようとすると、as演算子はEInvalidCast例外をスローします。 同じ条件下で、ハードキャストはnilを返します。
これで、このコードは正常に実行されます。
if MyInterface is TMyClass then
TMyClass(MyInterface).Bar;
もちろん、これは理解して使用する必要があります。 たとえば、参照カウント付きのインターフェイスと同じインスタンスへの参照カウントなしのオブジェクト参照の保存に関する通常のコンパイラ警告は有効なままです。
翻訳の改善にご協力ください。
translate.by/you/casting-an-interface-reference-to-the-implementing-class-in-delphi-2010/into-ru
翻訳者: r3code 、 debose 、 VesninAndrey