在不修改接口的情况下将delphi接口转换为其实现类

时间:2011-06-20 16:32:46

标签: delphi interface delphi-5

  

可能重复:
  How to cast a Interface to a Object in Delphi

使用Delphi 5;我有一个界面,由于遗留原因我不能改变。我正在传递(指向)遍布各处的接口。实现类有几个新属性 - 有没有办法强制从接口到实际实现的强制转换?

http://www.malcolmgroves.com/blog/?p=500说这是(新)在Delphi 2010中实现的,强烈建议以前不可能。确实如此,还是有一种我不熟悉的方式? RTTI,也许?

(我检查过,Delphi 5编译器确实不允许if pScore is TOleScore then - 这里pScore是我的pScore: IScore参数,而TOleScore是实现类。)

3 个答案:

答案 0 :(得分:3)

对我老板来说,答案是:使用非常有用的JEDI库,特别是GetImplementorOfInterface method

答案 1 :(得分:3)

我认为这两种方法都应该有效。


顺便说一下,有人知道Hallvard是否还活跃吗?在过去的几年里,我没有遇到过他。

答案 2 :(得分:2)

我做了“possible duplicate”问题的接受答案:

让对象实现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作为其公开的接口之一:

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;