下面是我载至《Delphi现象对象编程思想》里的东东。
type
IFoot: interface
['{297D26DC-6730-4FD7-BA51-EC321F6CDE5F}']
....
end;IBall: interface
['{E8231AB9-F0C5-4F2A-8A19-674208A37818}']
....
end;TFootball = class(TInterfacedObject, IFoot, IBall)
....
end;
....
var
FB: TFootBall;
F: IFoot;
B: IBall;
begin
FB := TFootball.Create;
F := FB;
B := F as IBall;
接口转型看似神秘,其实不难理解。其核心是Delphi调用了QueryInterface作为对接口的as运算符的部分实现。我们可以使用as运算符来进行检查的接口转换,这也称为接口查询。它从一个类引用转换为接口类型,或将一个接口引用转换为另一中接口类型,它基于实际的对象类型。接口转型的格式如下: object as interface
这里object是一个接口类型的表达式,或者是一个变体类型,或者是实现了某个接口的类型实例;interface是任何一个申明了GUID的接口。(为了能够查询到该接口,必须有申明好的GUID)。
如果object是nil,则返回nil;否则,传递interface接口的GUID到object的QueryInterface方法。Delphi调用QueryInterface来获得新的接口引用。问题一:既然要通过QueryInterface方法根据GUID获得其对应的接口类型,所以要获得接口类型则该接口必须要有GUID,可是我将上面两个接口的GUID注销,照样运行正常,说明还是转性了,这到底怎么回事?问题二:假设每个接口我都有GUID,我们知道父接口是不可以赋值给他的派生接口的,反之可以,那么为什么父接口是不可以赋值给他的派生接口呢,我们可以根据GUID再配合QueryInterface实现转型的啊。我觉得按照上面的说法,用GUID和QueryInterface可以实现任何接口转型,因为GUID唯一的吗!
大家帮我看看,我的误解在哪里,谢谢帮忙!
type
IFoot: interface
['{297D26DC-6730-4FD7-BA51-EC321F6CDE5F}']
....
end;IBall: interface
['{E8231AB9-F0C5-4F2A-8A19-674208A37818}']
....
end;TFootball = class(TInterfacedObject, IFoot, IBall)
....
end;
....
var
FB: TFootBall;
F: IFoot;
B: IBall;
begin
FB := TFootball.Create;
F := FB;
B := F as IBall;
接口转型看似神秘,其实不难理解。其核心是Delphi调用了QueryInterface作为对接口的as运算符的部分实现。我们可以使用as运算符来进行检查的接口转换,这也称为接口查询。它从一个类引用转换为接口类型,或将一个接口引用转换为另一中接口类型,它基于实际的对象类型。接口转型的格式如下: object as interface
这里object是一个接口类型的表达式,或者是一个变体类型,或者是实现了某个接口的类型实例;interface是任何一个申明了GUID的接口。(为了能够查询到该接口,必须有申明好的GUID)。
如果object是nil,则返回nil;否则,传递interface接口的GUID到object的QueryInterface方法。Delphi调用QueryInterface来获得新的接口引用。问题一:既然要通过QueryInterface方法根据GUID获得其对应的接口类型,所以要获得接口类型则该接口必须要有GUID,可是我将上面两个接口的GUID注销,照样运行正常,说明还是转性了,这到底怎么回事?问题二:假设每个接口我都有GUID,我们知道父接口是不可以赋值给他的派生接口的,反之可以,那么为什么父接口是不可以赋值给他的派生接口呢,我们可以根据GUID再配合QueryInterface实现转型的啊。我觉得按照上面的说法,用GUID和QueryInterface可以实现任何接口转型,因为GUID唯一的吗!
大家帮我看看,我的误解在哪里,谢谢帮忙!
解决方案 »
- delphi 调用带返回参数和游标的oracle存储过程
- cxGrid中可以编辑,Enter来移到下一个CELL,速度非常之慢,不知道为什么?
- delphi中查询access数据库中时间怎么写(精确到妙)
- 求教:delphi7 里有serversocket 吗? 马上给分!!! 不够再加!
- ***求助***此网站的背景图怎么获取,高难度!
- 用Tquery控件怎么向paradox7格式的表插入记录 在线等待
- 类型文件的保存问题
- 如何TEdit和TComboBox共用Color属性(40分)?
- 请问各位老大:如何判断当前计算机是服务器
- 千古悬案:倾囊而出以求一解。。。。:( 的没分了
- 对象中取出接口是什么意思?
- 在SQL某个字段中定义的数据类型为bigint型,值为负数。但在delphi中取出成了正数。为什么?100分,,急!!
什么叫注销?
不一定是转型,可能是通过接口查询实现了这个接口的类还实现了其它那些接口。