使用Delphi 5;我有一个界面,由于遗留原因我不能改变。我正在传递(指向)遍布各处的接口。实现类有几个新属性 - 有没有办法强制从接口到实际实现的强制转换?
http://www.malcolmgroves.com/blog/?p=500说这是(新)在Delphi 2010中实现的,强烈建议以前不可能。确实如此,还是有一种我不熟悉的方式? RTTI,也许?
(我检查过,Delphi 5编译器确实不允许if pScore is TOleScore then
- 这里pScore
是我的pScore: IScore
参数,而TOleScore
是实现类。)
答案 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;