4

クラス階層の祖先を TObject から TInterfacedObject に変更して、継承チェーンのさらに下にあるインターフェイスを実装できるようにすると、何か副作用はありますか?

私は Delphi で数年間プログラミングを行ってきましたが、インターフェイスに遭遇したことはありません。他の言語でそれらを使用することに慣れました。再び Delphi プロジェクトに参加したので、それらを利用したいと思いますが、Java や C# とは動作が少し異なることはわかっています。

4

3 に答える 3

4

クラスを使用する既存のコードが既にある場合は、オブジェクト インスタンスではなくインターフェイスへの参照を保持するために、おそらくコードの多くを変更する必要があります。インターフェイスは参照カウントされ、自動的に解放されます。その結果、実装者インスタンスへの参照は無効なポインターになります。

于 2010-10-28T16:29:03.660 に答える
3

これは、階層の最上位 (最下位?) で以下のクラスから継承する限り、うまく機能します。このコードは、TInterfaceObject のデフォルトの動作と同様に、新しいクラスがそれ自体を解放しないことを保証します。おそらく、すでにクラスを自分で解放しており、これを保持したいと考えています。このアクティビティは、VCL の TComponent が実際に行うこととまったく同じです。インターフェイスをサポートしますが、参照カウントは行いません。

type


  TYourAncestor = class( TInterfacedObject )
    function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;

  end;



implementation



function TYourAncestor.QueryInterface(const IID: TGUID; out Obj): HResult;
const
  E_NOINTERFACE = HResult($80004002);
begin
  if GetInterface(IID, Obj) then Result := 0 else Result := E_NOINTERFACE;
end;


function TYourAncestor._AddRef: Integer;
begin
  Result := -1   // -1 indicates no reference counting is taking place
end;

function TYourAncestor._Release: Integer;
begin
  Result := -1   // -1 indicates no reference counting is taking place
end;
于 2010-10-28T16:44:29.793 に答える
2

インスタンスサイズに数バイト余分にあることを除けば、違います。それがおそらくそれを行うための最良の方法です。

于 2010-10-28T16:13:02.330 に答える