2

重複の可能性:
Delphiでインターフェイスをオブジェクトにキャストする方法

Delphi5を使用します。従来の理由で変更できないインターフェイスがあります。私はあちこちでそのインターフェースを渡します(ポインター)。実装クラスにはいくつかの新しいプロパティがあります-インターフェイスから実際の実装にキャストを強制する方法はありますか?

http://www.malcolmgroves.com/blog/?p=500によると、これはDelphi 2010で(新しく)実装されており、以前は不可能であったことを強く示唆しています。これは確かに事実ですか、それとも私がよく知らない方法がありますか?RTTI、多分?

(私はチェックif pScore is TOleScore thenしましたが、Delphi 5コンパイラでは実際に許可されていません。これpScoreが私のpScore: IScore引数でありTOleScore、実装クラスです。)

4

3 に答える 3

3

どちらのアプローチでもうまくいくと思います。


ちなみに、Hallvardがまだアクティブかどうか誰かが知っていますか?私は過去数年間彼に出会ったことがありません。

于 2011-06-20T18:21:40.060 に答える
3

上司へのH/t、答えは次のとおりです。信じられないほど便利なJEDIライブラリ、特にGetImplementorOfInterfaceメソッドを使用します。

于 2011-06-20T17:32:09.250 に答える
2

私は「重複の可能性がある」質問の受け入れられた答えがすることをします:

オブジェクトにIObjectインターフェースを実装させます。

IObject = interface(IUnknown)
    ['{39B4F98D-5CAC-42C5-AF8D-0237C8EFBE4C}']
    function GetSelf: TObject;
end;

したがって、次のようになります。

var
   thingy: IThingy;
   o: TOriginalThingy;

begin
   o := (thingy as IObject).GetSelf as TOriginalThingy;

更新:ポイントをホームに戻すために、既存のオブジェクトに新しいインターフェイスを追加できます。

既存のオブジェクト:

type
    TOriginalThingy = class(TInterfacedObject, IThingy)
    public
       //IThingy
       procedure DrinkCokeZero; safecall;
       procedure ExcreteCokeZero; cafecall;
    end;

IObject公開するインターフェースの1つとして追加します。

type
    TOriginalThingy = class(TInterfacedObject, IThingy, IObject)
    public
       //IThingy
       procedure DrinkCokeZero; safecall;
       procedure ExcreteCokeZero; cafecall;

       //IObject - provides a sneaky way to get the object implementing the interface
       function GetSelf: TObject;
    end;

    function TOriginalThingy.GetSelf: TObject;
    begin
       Result := Self;
    end;

典型的な使用法

    procedure DiddleMyThingy(Thingy: IThingy);
    var
       o: TThingy;
    begin
       o := (Thingy as IObject).GetSelf as TThingy;

       o.Diddle;
    end;
于 2011-06-20T18:09:00.387 に答える