Delphi 2010でクラスを実装するためのインターフェイスリファレンスの変換

Delphi 2010のすべての革新が大きく目立つわけではありません。 チームは多くの追加機能、修正、改善を実現するために多くの時間を費やしました。 それらのいくつかは別に重要ではないように見えるかもしれませんが、全体に大きな影響を与えるだけでなく、製品に大きな調和をもたらします。

Delphi 2010の機能の1つは、多くの論争を引き起こすと思われますが、このインターフェイスを実装するクラスのタイプにインターフェイスリンクをキャストできることです。

IMyInterfaceインターフェースと、このインターフェースを実装するTMyClassクラスがあると想像してみましょう。

IMyInterface = interface
[ '{7AD04980-5869-4C93-AC29-C26134511554}' ]
procedure Foo;
end;

TMyClass = class (TInterfacedObject, IMyInterface)
procedure Foo;
procedure Bar;
end;


次に、タイプIMyInterfaceの変数が与えられたと想像してみましょう。 Barを呼び出したい場合はどうなりますか? インターフェイス参照をTMyClass型に単純にキャストしようとすると、コンパイラエラーが発生します。

私が見た最も一般的な解決策は、クラスの型を返すメソッドをインターフェイスに含めることですが、インターフェイスを特定の実装にバインドして、インターフェイスを最初に置く価値を破壊します。 また、それは嫌です。

そのような技術はもはや必要ありません。

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
翻訳者: r3codedeboseVesninAndrey

Source: https://habr.com/ru/post/J85504/


All Articles