关于接口的问题请教高人。(100分)

  • 主题发起人 主题发起人 zhaojianzhu
  • 开始时间 开始时间
Z

zhaojianzhu

Unregistered / Unconfirmed
GUEST, unregistred user!
IChannelHandler = interface
['{C4FB64C4-44B2-4959-A51D-6E17FDB11891}']
procedure process(pack: TJabberPacket);

IRoutableChannelHandler = interface(IChannelHandler)
['{7DE991FE-F8EB-4326-A669-D080CE85B4FA}']

end;
TSession = class(TInterfacedObject,IRoutableChannelHandler)
end;

var
obj:TObject;
session:IChannelHandler ;
obj=TSession.create;

if obj.getInterface(IChannelHandler ,session) then
session.process;
为什么这么写就不能取到接口而必须这样

if obj.getInterface(IRoutableChannelHandler,session) then
session.process;

用什么方法可以实现类似这样的表达式:
session:=obj as IChannelHandler;
 
TSession = class(TInterfacedObject,IRoutableChannelHandler,IChannelHandler)
end;
然后,session:=obj;即可!
 
可那样的话继承关系有什么用了
 
我明白你的意思,但getInterface只能得到它的直接接口。
从对象到接口转换是受限的,但接口间的as是宽松,因为它们本质上不同。
但是,你可以在QueryInterface里处理一下(下面是节约了判断的简写)
function TSession .QueryInterface(const IID: TGUID
out Obj): HResult;
var a:IChannelHandler;
begin
if self.getInterface(IRoutableChannelHandler,a) then
IInterface(obj):=a;
end;
此时,
obj.[red]QueryInterface[/red](IChannelHandler ,session);
if session<>nil then
session.process;
是可以执行的。
 
呵呵
其实接口的继承和类的继承是完全不一样的
接口的继承其实是一种伪继承,只具有语法意义,不具有现实运行时意义的。也就是说继承的接口在运行是不再具有关系
说白了,接口的继承只是一种偷懒的方法

TSession = class(TInterfacedObject,IRoutableChannelHandler) 这个类只实现了 IRoutableChannelHandler而没有实现IChannelHandler 接口,所以
TSession 的实例是没有 IChannelHandler 接口的。
虽然IRoutableChannelHandler是继承自IChannelHandler 。但是不具现实运行时意义的。也就是说这种继承是假的,没用的。
你要是想使用IChannelHandler 接口 
得这样写
TSession = class(TInterfacedObject,IRoutableChannelHandler,IChannelHandler )
 
后退
顶部