2

可能重复:
如何在 Delphi 中将接口转换为对象

使用德尔福 5;我有一个由于遗留原因无法更改的界面。我在各处传递(指向)该接口。实现类有几个新属性——有没有办法强制从接口强制转换到实际实现?

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

对我的老板来说,答案是:使用非常有用的 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为它公开的接口之一:

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 回答