TInterfacedObject
インターフェイスの使用 への移動
TInterfacedObject は IInterface のメソッドを実装しているため、1 つまたは複数のインターフェイスをサポートするクラスを定義するときは、TInterfacedObject を基底クラスとして使用すると便利です。TInterfacedObject クラスは System ユニットに次のように宣言されています。
type
TInterfacedObject = class(TObject, IInterface)
protected
FRefCount: Integer;
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
public
procedure AfterConstruction; override;
procedure BeforeDestruction; override;
class function NewInstance: TObject; override;
property RefCount: Integer read FRefCount;
end;
直接 TInterfacedObject からクラスを派生させるのは簡単です。次に示す宣言の例では、TDerived は TInterfacedObject の直接の下位クラスであり、仮想的な IPaint インターフェイスを実装しています。
type TDerived = class(TInterfacedObject, IPaint) . . . end;
TInterfacedObject は IInterface のメソッドを実装しているため、インターフェイス オブジェクトの参照カウントとメモリ管理を自動的に処理します。詳細については、「インターフェイス オブジェクトのメモリ管理」を参照してください。ここでは、インターフェイスを実装しながらも TInterfacedObject に固有の参照カウント メカニズムに従わない独自のクラスを記述することについても解説しています。