请大家给菜鸟讲讲Delphi中接口interface怎么理解?如何使用?
看书N久了,总是不的其解?

解决方案 »

  1.   

    就是接口,具体很难说明。你可以把它当成所有方法都是virtual + abstract的类。
      

  2.   

    接口在Delphi引入最主要的原因是为了支持COM,因为COM在C++中是通过多重继承来实现的,而Delphi中不支持多重继承,所以通过引入Interface来弥补这个缺陷。
    Interface除了在COM中应用广泛外,在我们设计类时也很派作用,但是用的并不多,主要就是用来模拟多重继承。这个概念在C#中也被引入了!
    总之,你要在Delphi中使用COM的话那就一定要用到Interface!
      

  3.   

    如果Interface不是用于COM的话,你就可以把它理解成纯抽象类,它只含有方法的定义,而没有实现,任何支持这个接口的类都要实现接口的方法后才能使用接口声明的方法。你也可以顾名思义“接口”,就是一个规范,就像我们主板上的PCI一样,它是一个总线规范,那么一个类如果遵守这个规范的,就可以使用这个接口来扩展它的功能,主板插上声卡后就能发声了。
    呵呵,也只能概括的说这么多,具体的用法可以参考书,只要你理解了这段话,接口也就不再神秘了,实现起来是很容易的!
      

  4.   

    Up→juliens(星星球),跟你神交了一段时间,感觉你回答问题很不错。
    补充一句话,接在“你也可以顾名思义“接口”,就是一个规范,就像我们主板上的PCI一样,它是一个总线规范,那么一个类如果遵守这个规范的,就可以使用这个接口来扩展它的功能,主板插上声卡后就能发声了。”后面。
    每个不同的声卡厂商(每个实现某个接口的类)只要能够遵守PCI总线规范(只要能够实现该接口的方法定义),就都可以插在主板上使用(就可以用这些不同的类实例化同一个接口并被使用)。
      

  5.   

    to:creativepeter(头皮屑)兄
      谢谢夸奖,以后我们多交流啊,你的补充十分正确!楼主只要知道接口存在的意义后相信就理解接口了!推荐两本书接口讲比较好的:《Delphi编程技术内幕》,《Delphi COM 深入编程》。
      

  6.   

    网上有篇资料叫(Interface 秘笈)对Interface讲得较为仔细
      

  7.   

    呵呵,interface(接口)不应该只是用于编COM,这个有些过时,现在很多语言都有接口,它的最大用处用来代替C++的多重继承的,在软件工程中证明是比抽象类更有用的一个模式
    简单地说,你声明一个接口,在里面声明一些方法,但不用现实它
    然后你再声明一个类,用来实现那个接口里面的方法。那么你就可以用那个类了。而一个类可以实现多个接口的方法。还有一点要注意,你定义了一类来实现某个接口的方法,则你必须实现那个接口的所有方法。
    推荐你一本书:刘艺的《Delphi面向对象编程》对于接口有独到的讲解。
           还有一本是外国人写的《Delphi6开发指南》也很不错。
    多看书,多看好书,进步会更大,祝你进步!!
      

  8.   

    我并没有说只应用于COM,也并不能说COM已经过时了。但Delphi增加Interface类型确实是为了COM,在VCL的源代码中,Interface用于除COM部分以外的地方并不多,可能是因为D3以前还没有Interface吧!当然,现在很多新兴语言基本都有接口的类型,应用越来越广泛,设计模式里也有接口的思想。因为实践证明多重继承的弊大于利,而接口可以很好的取代它。
      

  9.   

    没有COM照样会出现接口,接口是OO发展的产物,是模式理论的重要支柱,没有接口无法实现组合.....
      

  10.   

    VCL引入接口的概念比较晚,好像是为了COM,但是他的作用不但在为了支持COM和替代多重继承,而是在类的实现中内存效率通过借口大幅度提高,明显优于虚拟方法和VCl的动态方法。
    而且接口目前更是OOP的趋势。
    VCL的确很少用到接口。我看过一个例子利用接口实现了VCL的垃圾回收。
      

  11.   

    我的片面理解是:接口是一组API函授和二进制标准;一组函数的列表。
      

  12.   

    楼上介绍的那些资料我都有,只是还有一些不懂,说说我的一些理解,大家看看对不!1,接口是面向对象语言的的语言特性。
    2,接口的引入是为了实现多重继承的,但是怎么用接口实现呢?
       比方说父亲类TFather爱吸烟,母亲类TMather爱跳舞,那么怎么用
       接口来让儿子类TSun既有吸烟的习惯又有跳舞的习惯呢?
       请大家给出代码来分析,如果搞懂了这些,分数不成问题!
    3,接口没有属性,只有定义了方法,但不实现,而是在类中实现,
       类的实例中使用!
    4,接口在设计模式中大量使用,相信大家学习的时候,会有和我一样的困惑,
       希望高手能指点一二,不胜感激!
    5,Delphi中接口的引入早先是为了实现COM,到Delphi6就成为了Object Pascal
       语言的特性!各位大侠,能否结合实例来说说呢?多谢!!
       
      

  13.   

    实例可能在网上找一些源程序来看看。csdn 上也可以找到的,还有一个网站学习DELPHI也不错,就是DELPHI园地!
      

  14.   

    上面所说的资料上不是有很多例子的吗?一个类理论上可以支持无限多的接口来增加功能以配合接口规范制定者。
    那么像你所说的,以制定两个接口:IDance和ISmoke,那么母亲类就可以这么定义:TMather = Class(TInterfacedObject, IDance),父亲类:TFather = Class(TInterfacedObject, ISmoke),而儿子类:TSon = Class(TInterfacedObject, IDance, ISmoke),这样儿子类就实现了跳舞和抽烟两个接口。
    而如果不用接口的话,那么母亲和父亲要分别实现跳舞和抽烟的方法,而儿子类就要从母亲和父亲类多重继承下来。
    你可以对比一下,哪种方法的复用性高,利用了接口就能组合一些功能而使某个类增强。所有支持这个接口的类都拥有相同性质的功能,而具体的实现可以不一样!
      

  15.   

    建议看看李维的《Inside VCL》。
      

  16.   

    如果你有良好的C++基础,而又知道一些如何用C++编写COM的话,
    理解interface是小菜一碟,
    还好了,我有好的基础,只是为了快速开发的需要,我才看了看delphi的。
    不看不知道,还真是快!
    在学习的过程中,我感觉着,只要sdk下的windows编程原理通了,
    学习这些真的是小case!
    学习,再学习!
      

  17.   

    下面我就楼主的几个问题来回答:
    2:接口的引入是为了实现多重继承的,但是怎么用接口实现呢?
       比方说父亲类TFather爱吸烟,母亲类TMather爱跳舞,那么怎么用
       接口来让儿子类TSun既有吸烟的习惯又有跳舞的习惯呢?
    回答:看有没有机会,看一下刘艺的《Delphi面向对象编程》,对接口真的有很不错的讲解,而有有一些例子绝对值得学习,上面有人说的垃圾回收的例子,估计也是从这本书看到的,因为我就看到了,其余不多说,因为要完整的讲,不是一两句话就可以的,所以给你推荐一本,我想是最好的办法了吧。
    4,接口在设计模式中大量使用,相信大家学习的时候,会有和我一样的困惑,
       希望高手能指点一二,不胜感激!
    回答:还是刘艺的《Delphi面向对象编程》我认为这本书好多方面都讲得很清楚精彩,一定能够满足你的,我不是做广告哦,是真的看过,觉得很不错,我就用接口实现了一个Dll封装类对象的例子,也是从这里学的。其他问题不是问题,而是楼主的见解,也有一些道理,我相信楼主是为会用,理论我不多说,理论这种东西要说的话,可以废话一大堆,但最终目的要会用才行,最后推荐一次,看刘艺的
    《Dlephi面向对象编程》相信你一定会懂的。
      

  18.   

    1,接口是面向对象语言的的语言特性。
    ---------------------------------
      不是的,C语言也可以(实际上有很多C的库都是通过接口来操作的)
      接口不是语言特性,它是一种思想,或者概念,它只是是用来告诉调用者
      它能干什么,它提供什么服务,除此以外它不提供没有任何信息  也许会问,对于一个类对象的声明,我们也可以知道她提供什么服务?
      为什么要用接口呢?实际上,接口和一个对象的方法声明没有太大的区别,
      但是,接口的声明要比类对象的声明更简单,所基于的假设更少,更抽象,  通常,我们对于一个对象,我们所感兴趣的只是它能干什么,它能提供什么样
      的服务,在这一层面上,我们需要的只是接口,不管它是对象还是非对象,不管
      它是C实现,还是VB实现,或者Delphi实现,或者Java实现,,,  这就是接口的基本意义和作用:它将所提供的服务和这些服务的具体实现隔离开来。
      基于这一点,再加上COM强制要求每一个COM对象所提供的接口必须兼容它
      指定的二进制级规范,这就使得你可以无缝调用其他语言实现的COM对象,
      你有更多可用的实现。这就是接口在调用者看来的威力。  在实现者方面,你可以使用聚合,通过使用另一个对象来提供你对调用者承诺的接口,
      这时,你是接口服务器的同时又变成接口客户,这就是*接口继承*,和多重继承这种
      *实现继承*不同,你可以雇佣其他语言编制的对象。另外,当你更改你的接口的实现时
      你可以有更大的空间去更改,因为客户程序所依赖的是接口,除了接口以外,你可以改变
      任何东西,base class, 实现语言,数据结构等,完全用另一种对象来实现。但是类继承
      不行,因为,类继承的耦合程度太高,你不能改变base class(拼音太难打),实现语言,
      类继承路径,甚至对象的内存布局也是不能变更的,你一变更,客户程序就必须重新编
      译。在扩展方面,类对象可以通过继承来扩充新的服务,新的功能,但是同样会遇到刚才
      所讲的变更接口实现方面的问题。但是接口就灵活很多了。2,接口的引入是为了实现多重继承的,但是怎么用接口实现呢?
    ---------------------------------
       比方说父亲类TFather爱吸烟,母亲类TMather爱跳舞,那么怎么用
       接口来让儿子类TSun既有吸烟的习惯又有跳舞的习惯呢?
       请大家给出代码来分析,如果搞懂了这些,分数不成问题!   接口的引入*不*是为了实现多重继承的   你的思想是TSun一定具有TFather的恶习和TMather的天性
       但是接口不是这样,接口只是对象的某一面,对象是接口的幕后,
       就象人有很多面,当人富有的时候,满脑子是享受,穷的时候满脑子是赚钱,
       对象也可能有很多面,但是只有当你得到它的某一面时,你才能
       要求它提供这一方面的服务。对于使用者来说,你只知道接口,你对
       对象是一无所知的(理想状态下)。   所以对于一个Object,你首先也确定它是否会抽烟,然后才请它抽烟
       确定它会跳舞然后请它跳舞,你的例子不好打比方,就说抽烟和跳舞
       你的例子就是对每一个小姐,它都要求会抽烟跳舞,这些小姐就有点
       不专业了(假设抽烟需要专业培训),但是接口不是这么回事,和你
       抽烟聊天的也许是这个小姐,和你跳舞的也许又是另一个小姐,那么
       这种情况下,这些小姐就很专业了,术业有专攻嘛。   COM对接口强加一个协议,就是每一个接口必须支持QueryInterface服务,
       也就是必须提供洽询服务,好比每个小姐都必须回答你关于对方是否愿意
       提供什么服务的,这个强加的协议使得COM实现都具有多面性的特征,在
       Delphi用户看来,这象是多重继承,其实不是那么回事,Delphi的接口实现
       重来没有利用过多重继承的特性,因为语言本身不支持,更多的,可能利用
       聚集(组合)的模式来实现多接口。
       
       至于怎么实现,看看帮助和示例吧,学习都是需要一个过程的
    接口基本的东西很少,但是真正应用接口编程是需要基于一个规范和协议的
    (比如CORBA或者COM,XPCOM或者别的什么架构),还有很多实际编程上的问题。
    我没有使用过corba,只是用过一下COM,只知道这些皮毛,如果对COM感兴趣,我也推荐一下,推荐阅读:1.MSDN上的关于COM的文档,(很多人都不看文档和帮助,其实帮助能够帮你省一些买书的钱)
    2.Delphi的关于COM的帮助,
    3.Don Box的Essential COM。至于Delphi COM Programming这本书,没有看过,上书店没找到,
    不过从一些读者的re和一些杂志的review上来看,评价不是很高
      

  19.   

    To 小风
      这怎么能叫买骚呢,那叫买弄,哈哈哈哈.....Alphax,好久不见了.....
      

  20.   

    好久不见,我上论坛来问问题的,平常都是登录了赚点可用分,然后就挂着帮忙看看,http://community.csdn.net/Expert/topic/3104/3104509.xml?temp=6.373233E-02
    http://community.csdn.net/Expert/topic/3099/3099243.xml?temp=.7752039