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翻訳者:
r3code 、
debose 、
VesninAndrey