关于接口的问题(50分)

  • 主题发起人 主题发起人 小穷仔
  • 开始时间 开始时间

小穷仔

Unregistered / Unconfirmed
GUEST, unregistred user!
我刚刚看懂了一点什么是接口, 可是看到Delphi从入门到精通的
一个例子(D3),p673
var
Anobj : Iunknown;
shlink : ishellLink;
PFile : IPersistFile;
begin
AnObj := createComObject(clsid_shelllink);
Shlink := AnObj as IShelllink;
pFile := AnObj as IpersistFile;
...
我就不懂了, 既然AnObj是按clsid_shelllink产生的,
为什么能强制转换成IpersistFile类型的?请多多指教!
 
这个问题基本上来说比较难,嘻嘻,我还是回去看看书,再来回答!:)
 

IUnKown->IPersist->IPersistFile
IUnKown->IShellLink
它们有共同的祖先。而Anobj是Iunknown,当然可以转换。
 
是阿, 他们都是IUnkown 的派生, 但是IUnkown只是提供 基本的虚函数,
而真正我们所需要的实现应该是在其派生接口的吧(我猜的^o^)如果这样,
我们在调用PFile.Setpath 时, Iunkown 应该不存在这个虚函数, 这
是怎么转化的?
 
不是已经AnObj as IpersistFile了吗?
就象可以
(Sender as TButton).Caption,
而Sender是TObject,并没有Caption.
 

谢谢0*0 , 但是我怎么还是想不通?
我一直理解, (Sender as TButton).Caption 时, Sender 肯定是TButton及其
子类, 或者又一个caption属性, 若一个Sender类没有Caption属性, 那么这样用
会不会出错? 我想应该会有问题吧!
这里如果IpersistFile 继承于 Ishelllink ,我可以想通,但是, 现在,
是不是我一直把(Sender as Tbutton).Caption理解错了?
 
你把 (Sender as TClass) 和 (Sender is TClass) 混淆了!
 
as 操作符使用了 QueryInterface 来找接口。
 
所得到的COM对象实际上实现了几个接口,而不是普通的类继承概念。
AnObj as IPersistFile实际上由Delphi编译器生成了调用QueryInterface的
指令来查找IPersistFile接口。
 
Pipi,xyzer说的很对,在这一点上,Delphi隐藏了接口间的Query问题,这样做的好处是用Delphi调用接口简单化,但不利的一点就是隐藏了问题的实质。至于为什么能查询到其他接口,这可是COM的初衷了,如果不能查询到其他接口,COM就不会有今天的成就了
 
我现在明白了不少!
xyzer说的好!
 
多人接受答案了。
 
后退
顶部