接口有什么作用?

Mudeen 2002-06-01 12:04:22
最近初看Com,稍微看了一下接口。接口解决的object pascal里面无法实现多重继承的问题,除了在Com里面的用途之外,似乎感觉它跟纯虚类没有什么区别。
比如:定义一个抽象类,里面只定义abstract方法;
定义一个接口,里面也定义一些方法。
感觉以上两者并无多大区别:都不能创建实例,都不能存储数据,都没有具体实现。
请高手指教一下好吗?
尤其是请谈一谈接口在com中的作用。
...全文
205 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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技术手册>>中的一段话
有的是原文,有的是自己说的

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

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

1. Java基础部分 7 1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 8 2、Java有没有goto? 8 3、说说&和&&的区别。 8 4、在JAVA中如何跳出当前的多重嵌套循环? 8 5、switch语句能否作用在byte上,能否作用在long上,能否作用在String上? 9 6、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 9 7、char型变量中能不能存贮一个中文汉字?为什么? 9 8、用最有效率的方法算出2乘以8等於几? 10 9、请设计一个一百亿的计算器 10 10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 11 11、"=="和equals方法究竟有什么区别? 12 12、静态变量和实例变量的区别? 13 13、是否可以从一个static方法内部发出对非static方法的调用? 13 14、Integer与int的区别 13 15、Math.round(11.5)等於多少? Math.round(-11.5)等於多少? 14 16、下面的代码有什么不妥之处? 14 17、请说出作用域public,private,protected,以及不写时的区别 14 18、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? 15 19、构造器Constructor是否可被override? 16 20、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法? 16 21、写clone()方法时,通常都有一行代码,是什么? 16 22、面向对象的特征有哪些方面 17 23、java中实现多态的机制是什么? 18 24、abstract class和interface有什么区别? 18 25、abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized? 20 26、什么是内部类?Static Nested Class 和 Inner Class的不同。 20 27、内部类可以引用它的包含类的成员吗?有没有什么限制? 22 28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 23 29、super.getClass()方法调用 23 30、String是最基本的数据类型吗? 24 31、String s = "Hello";s = s + " world!";这两行代码执行后,原始的String对象中的内容到底变了没有? 24 32、是否可以继承String类? 25 33、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别? 25 34、String 和StringBuffer的区别 25 35、如何把一段逗号分割的字符串转换成一个数组? 26 36、数组有没有length()这个方法? String有没有length()这个方法? 26 37、下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d"; 26 38、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 27 39、下面的程序代码输出的结果是多少? 28 40、final, finally, finalize的区别。 30 41、运行时异常与一般异常有何异同? 30 42、error和exception有什么区别? 30 43、Java中的异常处理机制的简单原理和应用。 30 44、请写出你最常见到的5个runtime exception。 31 45、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗? 32 .... ....

5,930

社区成员

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

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