下面是我载至《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唯一的吗!
 
大家帮我看看,我的误解在哪里,谢谢帮忙!