Delphi 6 的 Interface(50分)

delphi的interface使用非常麻烦,
要实现那三个方法,
不知道有没有人知道到底怎么用,
哪位说说让大伙都学一学。
 
//要实现那三个方法,
你从 TInterfacedObject 继承不就不用自己实现这三个方法了
 
to beta:
我也知道要实现那三个方法,
但是我就是不知道怎么实现,
实现那三个方法的时候到底要注意什么?
接口的作用就是可以让任何类实现这个接口,
如果每次都从TInterfacedObject继承的话那接口就没有任何意义了。
我看了delphi6vcl的源码,
里面用到了接口,
也实现了那些方法,
但是仍然是不得要领。
我用google搜了很多文章,也还是不知道怎么搞,
我问了很多人,他们也都不知道。
学delphi的悲哀就是它的文档太乱了,
这么重要的东西居然没有例子,
所以新的东西往往也很难掌握,
既然如此的话,再新的东西又有屁用?
 
这和 delphi 的文档没有太大关系,因为这本身就和 delphi 没有太大关系,
你问这些东西的原因是你没有真正掌握 interface 的思想,而不是 delphi。
建议你应该多看 interface 相关的资料,如《COM 本质论》。
 
beta老兄你搞错了,
这个interface和com的interface是两码事。
我说的是类似于java的interface,
跟com没有任何关系。
在java中用interface没有任何特殊的地方,
而在delphi中偏偏就要实现那几个方法,
而没有任何地方说怎么实现那几个方法,
所以也很少人知道到底怎么用。
我敢打赌知道怎么实现那三个方法的人聊聊无几
 
[:(]
我的理解是 delphi 里面的 interface 是为接口而设置的,你要用类似 java 的
interface,那就用抽象类好了。

//我敢打赌知道怎么实现那三个方法的人聊聊无几
那你就错了:)

 
也不一定要实现那三个方法的
要看你是从哪个接口继承的吧
 
我的意思就是要任意想实现某个接口的类都能实现某个接口,
就像java一样。
beta:
你的意思是说了解怎么实现那三个方法的人不少,
但是怎么没有一个人出来说说经验呀?
上面的那么多高手都说了,
但就是没说怎么去实现那三个方法呀。
 
建议你支去看刘芑的一本新书
我鄱了一下,上面对接口的实现讲得很详细
 
52free:
您说的刘芑的一本新书叫什么名字?
 
>>你的意思是说了解怎么实现那三个方法的人不少,
>>但是怎么没有一个人出来说说经验呀?
>>上面的那么多高手都说了,
>>但就是没说怎么去实现那三个方法呀。

看看VCL TInterfacedObject的代码就可以了呀,要是嫌那里面的实现不够直接,
可以看看Demos中的 Demos/ActiveX/ShellExt/qregister.dpr,纯指针实现
 
呵呵,两年多前的老帖,现在看起来有时光倒流的错觉。

路过打个岔,各位继续,俺现在对Delphi是基本丧失发言权了:)
 
Sunny18:
TInterfacedObject我看过n多遍了,
而且delphi中类似于这个类的类还有不少,
但是每个类实现的方法都不同,这是为什么?
所以我看不懂,
如果你懂了,不妨谈谈你的心得,
让大家都来学习学习。谢了先。
 
//但是每个类实现的方法都不同,这是为什么?
道理很简单,按照自己的需要实现—AddRef 的时候增加引用计数,Release 的时候
减少引用计数,引用计数为 0 的时候释放。。。自己直接实现,自己变相实现,或
通过代理实现,总之就是按照自己的需要实现,只要遵循了该思想即可。

至于一定要说清楚为何要这样实现,那谁能笼统的说清楚?只能拿到一个具体的类,
了解该类的具体意图的时候,才能说如何去设计,如何去实现。
这的确是属于 COM 式接口的思想(你又不信),要是你只需要使用 java 式的接口,
你大可不必理解这些。

ISomeInterface = interface(IInterface)
['XXXX....']
procedure proc1;
procedure proc2;
end;

TSomeClass = class(TInterfacedObject, ISomeInterface)
public
// 一定要实现 ISomeInterface 中的两个方法
procedure proc1;
procedure proc2;

// 不需要再实现那三个方法

// 然后是自己的东西。。。
...
end;

这不就是你想要的 java 式的 interface 吗,需要考虑那么多吗?很简单的。
 
谢谢beta://
不过你这样的例子到处都有,
mastering delphi 6上面相关例子比你这个还详细。
你知道接口的好处是什么吗?
接口的好处就是可以让任何一个类来实现这个某个接口,
如果要每次都从TInterfacedObject类继承,那接口就失去的灵活性,
还不如去用抽象类来实现。
就算用这样的方法,那delphi中类似TInterfacedObject的类总共有三个,
你能说清楚这三个类的区别吗?什么时候要分别从哪个类继承?
 
//还不如去用抽象类来实现。
根据你的要求,本来就是这样啊:)

//那delphi中类似TInterfacedObject的类总共有三个,
//你能说清楚这三个类的区别吗?什么时候要分别从哪个类继承?
你直接把那三个类的名字贴出来,让大家告诉你不就可以了:)
 
就我所知,Delphi中常用的接口的基本实现有两种[纯属个人理解],一种就是接口的类型
信息是封装的COM的那套东东,这其中最基本的又有两个TComObject TAutoObject 分别对
应实现 IUnknown和IDispatch,IUnknown提供基本的引用计数、 及服务接口的查询的功能
,如果在使用中全部使用编译时绑定,这应已经足够了,而如果要想进行调用时动态绑定,如某些OLE自动化调用,就要用到IDispatch提供的类型信息的服务.另一种就如
TInterfacedObject,它根COM没有任何实质上的关系,相应的类型信息亦是由Delphi或者说
是Object Pascal自己在维护,只不过由于Delphi中的接口早期是为了支持COM而引入的,
所以留下了一些COM的影子.

以上纯属个人理解,如有不对的地方,还请各位大虾指正.
 
Delphi的接口从出现以来(D3开始引入,D4逐渐成熟),就一直是使用的COM那套思想,因此他和Java/C#中那种语言一级的接口支持是不太一样的。你看看System.pas里面的_IntfCopy/_IntfCast等函数实现就会发现,Delphi中对接口的操作实际上就是编译器一级对COM接口操作的包装而已。只不过从D5/D6开始,Borland逐步增强类对接口概念的支持(直接翻译到类的VMT中),并在引入CLX后试图淡化COM对其影响。以前IUnknown的实现类我记得都不叫现在这个名字,是引入CLX后才改名叫IInterface/TInterfaceObject,以试图在linux等不直接支持COM的平台上移值VCL。因此你想彻底抛弃COM那套思想使用Interface,虽然不是不可能,但必须受到很多限制。
 
to ildg
d6的TComponent已经实现了IInterface(IUnkown),所以只要继承于TComponent就可以了,
不用一定继承于InterfacedObject
function QueryInterface(const IID: TGUID
out Obj): HResult
stdcall;
function _AddRef: Integer
stdcall;
function _Release: Integer
stdcall;
这三方法以及Guid都是delphi必须的,因为delphi的底层实现都依赖这些,所以即使开发
Corba,Soap的Interface也会有Guid
 
shiningplus:
这个我也注意到了,
但是如果必须要从某些类继承的话接口就没有任何意义了。
 
顶部