Delphiにもインターフェースは存在する。
全てのインターフェースの基本クラスは「IInterface」。
ただし、Javaや.NETとは違い、インターフェースを継承すると
・_AddRefと_Release(参照カウントメソッド)
・QueryInterface(指定したインターフェイスへの参照を返す)
も実装する必要があるので、
-
THoge = class(TObject, IInterface)
とだけ書くとコンパイルエラーになる。(「IInterface.QueryInterface の実装が見つかりません」などのエラーが3つ出る。)
そこで、「既に実装が終わっているクラスを取り込む」という手抜き実装を行う。
Delphiのクラス階層で最初に出てくるでインターフェースの実装が最初に行われているのは「TComponent」。
つまり、
-
THoge = class(TComponent, IInterface)
と書くとコンパイルエラーが無くなる。
例えば、インターフェースを
-
IInformation = interface
-
procedure GetInfo;
-
end;
と用意し、そのインターフェースを使用するクラスを、TComponentを継承して実装する。
-
TInformation = class(TComponent, IInformation)
-
procedure GetInfo; // これは実装する。
-
end;
とすれば、AddRef、_Release、QueryInterfaceはTComponentで実装済みなので、自分で書く必要が無くなる。
TComponent以下であればTButtonなどでも出来るけど、TComponentを継承していないクラスやTComponentの親クラス(TPersistent、TObject)を継承する場合は_AddRef、_Release、QueryInterfaceを自分で実装するしか無さそう。TObjectから派生したTInterfacedObjectを使えば良い、という事をpikさんから教えてもらいました。ありがとうございました。
TInterfacedObjectの定義を見ると、
-
TInterfacedObject = class(TObject, IInterface)
となっているため、今回の用件を満たしている。
なので、
-
TInformation = class(TInterfacedObject, IInformation)
もAddRedなどを自分で書く事無く使用可能。