unit Unit3;interfaceuses SysUtils;type
  carMove = interface
    function SpeedDown(): string; //减速
    function ShutDown(): string; //停止
    function Start(): string; //启动
    function carspeedUp(): string;
    function StartBrake: string; //启动刹车
  end;  {父类:汽车类}
  Tcar = class(TObject)
  private
    name: string;
    Fwheel: Twheel;
    Fbrake: Tbrake;
    Fengine: Tengine;
    Fcarbody: Tcarbody;
  public
    function CarPackage(s: string): string; virtual; //组装汽车
  end;  TAodiQ7 = class(TCar, carMove)
  private
  protected
    //  interface  carMove
    function SpeedDown(): string; //减速
    function ShutDown(): string; //停止
    function Start(): string; //启动
    function carspeedUp(): string;
    function StartBrake: string; //启动刹车
  public
    function CarPackage(s: string): string; override;
  end;implementation{ TAodiQ7 }function TAodiQ7.CarPackage(s: string): string;
beginend;function TAodiQ7.carspeedUp: string;
beginend;function TAodiQ7.ShutDown: string;
beginend;function TAodiQ7.SpeedDown: string;
beginend;function TAodiQ7.Start: string;
beginend;function TAodiQ7.StartBrake: string;
beginend;{ Tcar }function Tcar.CarPackage(s: string): string;
beginend;end.接口carMove  声明的 SpeedDown() ShutDown() Start() carspeedUp()    StartBrake这几个函数和方法在子类TAodiQ7又重新申明了,我不明白的是既然又重新申明为什么还要在接口申明不是多此一举吗,没分了请大家不要见怪

解决方案 »

  1.   

    TAodiQ7是接口的实现类,这不是类的继承,不要用类的思维方法,接口可以多重继承,但delohi类不可以多重继承,为什么用接口,这不是三言两语能说明的,可以简单的理解接口的抽象级别更高,至于什么时候用接口没什么时候用类,只能慢慢体会,只可意会不可言传
      

  2.   

    其实就Delphi的VCL架构采用继承/委托这样的结构基本是完全能涵盖“接口”这样的概念了,不过,“接口”本质上是Windows体系里的,也就是微软的利器,既然你要开发For Windows的应用程序嘛,那当然要妥协的啦。
      

  3.   

    与windows没有多少关系,虽然最初接口出现的时候是为了简化基于COM的程序设计(在D5中,最基本的接口是IUnknown,显然是COM相关的),不过从D6开始,基本接口已经变成了IInterface,是基础语言特性。
      

  4.   

    COM 本身就是当初 Microsoft 为 Visual Basic 3.0 制订的控件规范,如果从效率上看,COM 被VCL秒得渣都不剩了,不过,Microsoft 毕竟控制了基础平台,所以就又搞个 DCOM 出来忽悠呗
      

  5.   

    个人理解,接口定义只是类功能扩展的一个说明,在被继承的类中,没有具体的实现方法,所以,没有override关键字,但继承该接口的类必须提供实现该接口的方法(即使仅仅只有一对begin end),所以,后面必须再声明一次;一个类被继承时,可以有多种接口,生成不同新类,当然也可以没有接口,这样只是给类改了个名字而已,或者通过覆盖父类的方法,在原有类的功能基础上加强功能而生成新类,象Form1 = Class(TForm)就是一个不带接口类的继承;另一个理解是,接口也是一个类,只是一个抽象类,没有现成的实现方法(不象真正的类,本来就带有实现方法),只是给了个名字给你,要怎么实现看你的本事,继承只是将两个类打包成一个拥有更多功能的类,被继承的接口和被继承的类应该没啥大的关系,反而跟继承它的类有很大的关系。
      

  6.   

          接口的用途非常广而且很重要,它主要是保证继承自不同基类的派生类能够增加一些共同特性,一个人可以不可以8条腿,在人的基类里定义是不能的,因为只有两条。。如果某件事情要求很简单,你要有8条腿就可去做,并不关心你继承自哪个基类,那么由于继承自不同基类的派生类没有共性,想让他们有,另一个办法就是继承一个接口,人装6个假肢就行了,但螃蟹也要继承这个接口,但不用装假肢,这个接口就是他们的共性在程序中代码对于函数调用不是根据函数名的而是地址偏移,这要切记,接口可以锁定地址偏移(这是为什么在Dilphi里接口要有GUID的原因),继承自不同类型的派生类,就算有两个从名称到参数完全相同的函数,他也不是他们之间的共性,只能说是代码上撞衫了,源码是源码,但机器码只人地址,不能有效定位地址那就没法运行,具有相同特性就是在统一个偏移量上有相同功能的函数或变量,名字不是机器码中所具有的特性。
      

  7.   

    无论是接口还是类,他的目的是起到对成员进行地址定位的作用,你要有这个理解,代码之人地址,假设一个超多网格的柜子(对象内存),其中第四个是苹果,第5个是鸭梨,这是基类定义好的,所以所有派生类都会是这样,第四个是苹果,第五个是鸭梨。。另一个基类是第四个是枪子,第5个是炸弹,第六个才是苹果一个人从箱子里找苹果吃,但没有名字只有编号(对于CPU是这样的),必须要知道他的派生自哪个类型,否则直接想当然的选4号你可能要吃到是枪子所以上以上两个类虽然都有苹果,但没有共同特征,CPU做不到对苹果的定位,抽象类基类存在的意义就是相同特性想相同定位,派生自不同类就是两个世界
    还有就是接口的问题,由于一个类只能继承一个基类,也就是上面的两种箱子注定不可能有共性定义了,当然没这么悲剧,还有接口在,假设一个接口的定义是,看到红色箱子(接口的GUID)向后数5个各自就是橘子,那么以上两个不同的类只要继承这个定位方法,就可以让CPU顺利找到橘子了,和他的派生自哪个类没半毛钱关系,接口虽然没有实现任何内容,但它明确给出了函数定位方式,在GUID后偏移4个字节就是第一个接口成员函数的函数指针,以此类推,那么继承者也会按这个规则编译接口函数指针地址,那么共性就有了。。