关于接口的概念性问题(200分)

  • 主题发起人 主题发起人 sanhippo1
  • 开始时间 开始时间
S

sanhippo1

Unregistered / Unconfirmed
GUEST, unregistred user!
问题一:
Type
0) ICanFly=interface
...
TAirplane=class(TInterfacedObject,ICanFly)
...
var
Airplane1:TAirplane;
Flyer1:ICanFly;
begin
1) Airplane1:=TAirplane.Create;
2) Airplane1.Fly;
3) Flyer1:=TAirplane.Create;
4) Flyer1.Fly;
end;
问题:
a. 0)ICanFly是不是继承自IUnknow?
b. 1)和3)执行后内存中分别发生了什么事?
c. 2)和4)执行后内存中分别发生了什么事?
d. 1)和3)是否都在内存中创建了一个TAirplane的实例?
e. 接口是指向类的指针?或别的什么?和类有什么区别?举个例子吧。
f. 怎么叫TAirplane继承TInterfaceObject实现ICanFly接口?
怎么叫实现?实现后又能干什么?
g. GetInterface和QueryInterface有何区别?

问题二:
type
IAnmial=interface
IBird=interface(IAnimal)
TAnimal=class(TInterfacedObject,IAnimal)
TBird=class(TAnimal,Ibird)
TEagle=class(TBird)
var
Anima:IAnimal
begin
Anima:=TEagle.Create;
问题:
h) Anima为什么能用TEagle.Create?
是不是因为TEagle最上极是TAnimal实现IAnimal接口?


我对接口的概念很混乱,希望各位大虾说清晰一点,多谢了。
 
a.ICanFly是继承自IUnknow ICanFly=interface(IUnknow) IUnknow可省
b.1)执行后,为Airplane1分配内存空间;3)创建一个TAirplane赋给接口
c.执行两个过程,内存变化难定
d.1)肯定,3)好象也创建一个
e.
f.ICanFly中有Fly过程,在TAirplane实现;TAirplane则继承自TInterfaceObject
g.
h.

我也知道的很好,并觉3)好象有问题。挂个号,看高手的解答
 
g:

GetInterface为as 接口转换时内部调用,是在已又的对象中查询接口
QueryInterface是从接口中询问是否有支持IID,如有,返回一对象,否则nil.


h:
TInterfacedObject继承TObject
 
a.icanfly继承于IUNKNOW
B。1)建立了一个对象AIRPLANE 3)建立了一个接口实例FLYER1,因为TAIRPLANE实现了ICANFLY接口,隐式转换。
C。2、3)执行一样。这是接口的特性。
D。B已回答。
E。接口可认为是纯抽象的类,只定义不实现。一般用于COM编写。要用具体的类去实现它的全部方法。理解了抽象的意义,你就知道接口的苦心了。
F。INTERFACEOBJECT类是一个很简单的类,它实现了IUNKNOW的方法,因为ICANFLY
继承于IUNKNOW,如果没有一个类实现IUNKMOW的方法,在你的类中就得实现ICANFLY
接口及它的所有父类接口的方法。
G。GETINTERFACE是从一个接口CLSID返回一个接口,QUERYINTERFACE是查询有没有
你所输入的CLSID。
H。继承关系,好累人呀。
请赶快重新学一下面向对象,底子不扎实,
关于写接口,多写几个关于WINDOWS SHELL的DEMO就可以学很多。
赶快加分吧,累死了。
有不懂的地方可给我写信
BACKMAIL@263.NET
 
对于COM来说,接口是一个函数指针数组的内存结构
每个指针指向一个COM实现的函数
 
多谢阿朱同志,我好象有点明白了。

最后一点疑问:

ICanFly是不是就相当于TAirplane的又一个"父类",
并且里面全是抽象的方法,这些方法在TAirplane中"实例化"了?
可能用词不当。
 
可以这样认为.
 
多人接受答案了。
 
后退
顶部