接口有什么作用?

Mudeen 2002-06-01 12:04:22
最近初看Com,稍微看了一下接口。接口解决的object pascal里面无法实现多重继承的问题,除了在Com里面的用途之外,似乎感觉它跟纯虚类没有什么区别。
比如:定义一个抽象类,里面只定义abstract方法;
定义一个接口,里面也定义一些方法。
感觉以上两者并无多大区别:都不能创建实例,都不能存储数据,都没有具体实现。
请高手指教一下好吗?
尤其是请谈一谈接口在com中的作用。
...全文
196 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxpbuaa 2002-06-01
  • 打赏
  • 举报
回复
我的感觉,接口其实相当于一种规范,它定义一些方法表明它要实现某种功能,但是又不具体实现这个功能,而是交给实现它的类或者实现它的子接口的类去实现。
所以,如果实现了接口的类的功能不具有一定的代表性和广泛性,比如你用一个带接口的类去实现5+5=10,那就没有什么意思了。所以接口主要COM对象——一种具有相当通用性的类中使用(Jave中也有接口,就是为了替代多重继承)。为了引用程序引用和子接口、子类继承引用的方便,产生了IDL(接口定义语言),用来描述接口,由于IDL使用非常繁琐,Delphi开始用类型库(TLB)来代替IDL,并且提供可视化编辑界面让用户编辑,它在后台自动生成类型库文件(也可以生成IDL文件),大大方便了接口的使用。

—————————————————————————————————
MaximStr := '宠辱不惊,看庭前花开花落,去留无意;
毁誉由人,望天上云卷云舒,聚散任风。';
if Not Assigned(I) then
I := TI.Create(Nil);
I.Maxim := MaximStr;
I.Explain := '假如上述代码中出现“OA”、“3D”等字样,改为“=”或者去掉';
I.Desire := '加不加分随你';
—————————————————————————————————


lxpbuaa 2002-06-01
  • 打赏
  • 举报
回复
楼主上面说的都是完全正确的。
我补充几点:
1、接口在Delphi中有两种用法。一种实现在一个类上(这是不需要GUID,因为不需要注册这个接口),另一种用在COM中(需要GUID)。
2、接口中只能定义方法。
(1)没有方法的实现。
(2)不能定义变量。
也就是说接口中的方法都是虚的,需要在类中实现。
3、COM对象实现了接口,在系统中注册后可以重复调用。在面向对象开发环境中,使用COM对象的时候,通常通过向应用程序中引入类型库(.tlb,.dll,.exe,.olb等文件中)的办法来获得COM对象中的接口方法的申明,从而调用它们。
先说这么一点吧。

—————————————————————————————————
MaximStr := '宠辱不惊,看庭前花开花落,去留无意;
毁誉由人,望天上云卷云舒,聚散任风。';
if Not Assigned(I) then
I := TI.Create(Nil);
I.Maxim := MaximStr;
I.Explain := '假如上述代码中出现“OA”、“3D”等字样,改为“=”或者去掉';
I.Desire := '加不加分随你';
—————————————————————————————————


netlib 2002-06-01
  • 打赏
  • 举报
回复
其实你可以认为接口是一种形式上的虚基类(只有申明,没有实现),所以对于接口,也一样存在着继承的问题。比如说 IDispatch 和
IUnknown,由于IDispatch 是 IUnknown的子类,所以 IDispatch IsA IUnknown,也就是说
IDispatch 具有 IUnknown相似的功能。
Object Pascal中对于 is 和 as 的实现的问题上是比较特殊的。当 as
运算符使用到接口时,其实是操作的它的QueryInterface方法,并且由于QueryInterface使用了AddRef,所以 as
对TObject子类的操作就不同了。而 is 运算符只是通过了 TObject 相应的方法就可以得到(就像是RTTI的功能),显然,接口和
TObject 没有必然的联系,所以 is 运算符不能使用到接口上。但是,这不能否定接口具有继承的能力。
还有一个问题能说明接口继承特性的就是对接口的实现,如果,我们要实现IDispatch接口,必须要实现AddRef、Release、QueryIn
terface这些函数,而这线又都是IUnknown的方法。
短歌如风 2002-06-01
  • 打赏
  • 举报
回复
接口是Delphi为了支持COM而增加的类型.
接口是COM的基本概念,它来源于抽象类的概念,利用接口可以实现OOP中的"接口继承",但不能实现"实现继承".
由于一个类可以实现多个接口,我们可以用它在Delphi中实现多重继承,不过仅仅是"接口继承",如果要实现"多重实现继承"就只能用"组合"的方式去实现了.
Billy_Chen28 2002-06-01
  • 打赏
  • 举报
回复

接口的定义:
COM定义了一个对象的函数怎样在内存中布置的标准,这些函数被安排到虚拟表,类似于DELPHI的虚拟方法表。编程语言对每个虚拟表的描述就是接口。

接口的作用:
接口包含一些函数和过程,以便来操作这个COM对象
接口并不实现自己,只是一个约定,它包含两个部份:
1、定义部分 这是COM对象和这个定义的对像共享的
2、实现部分 申明的方法的实现

......
Mudeen 2002-06-01
  • 打赏
  • 举报
回复
谢谢楼上两位同学。
我这几天正在看这方面的东西,有些概念还不是很清楚。谢谢两位的解说。
也希望更多的同学加入到我们的讨论中来,我觉得要想深入的学习delphi了解一些这些方面的东西是必须的。
xzgyb 2002-06-01
  • 打赏
  • 举报
回复
看了<<delphi技术手册>>中的一段话
有的是原文,有的是自己说的

接口最大的用途是把类继承与类型继承分离开来,类继承是实现代码重用的最有力的工具,派生类可以轻易继承基类的字段,属性,方法。但类继承会迫使派生类
存储基类声明的所有字段,但有时不需要这样,

而接口正是解决这个问题的,也就是说类型继承
在接口中声明的只能是方法和属性,而没有字段。它是调用者和被调用者之间的一种协议,调用者不管具体怎么实现,用什么字段,用什么数据,只是使用这个公布的接口所提出的行为

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧