类和接口的问题

ilovesafety 2017-10-14 11:36:24

unit Unit3;

interface

uses 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;
begin

end;

function TAodiQ7.carspeedUp: string;
begin

end;

function TAodiQ7.ShutDown: string;
begin

end;

function TAodiQ7.SpeedDown: string;
begin

end;

function TAodiQ7.Start: string;
begin

end;

function TAodiQ7.StartBrake: string;
begin

end;

{ Tcar }

function Tcar.CarPackage(s: string): string;
begin

end;

end.



接口carMove 声明的 SpeedDown() ShutDown() Start() carspeedUp() StartBrake这几个函数和方法在子类TAodiQ7又重新申明了,我不明白的是既然又重新申明为什么还要在接口申明不是多此一举吗,没分了请大家不要见怪
...全文
2214 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
mk_lucifer 2018-02-08
  • 打赏
  • 举报
回复
无论是接口还是类,他的目的是起到对成员进行地址定位的作用,你要有这个理解,代码之人地址,假设一个超多网格的柜子(对象内存),其中第四个是苹果,第5个是鸭梨,这是基类定义好的,所以所有派生类都会是这样,第四个是苹果,第五个是鸭梨。。另一个基类是第四个是枪子,第5个是炸弹,第六个才是苹果。。。一个人从箱子里找苹果吃,但没有名字只有编号(对于CPU是这样的),必须要知道他的派生自哪个类型,否则直接想当然的选4号你可能要吃到是枪子。。。所以上以上两个类虽然都有苹果,但没有共同特征,CPU做不到对苹果的定位,抽象类基类存在的意义就是相同特性想相同定位,派生自不同类就是两个世界。。。 还有就是接口的问题,由于一个类只能继承一个基类,也就是上面的两种箱子注定不可能有共性定义了,当然没这么悲剧,还有接口在,假设一个接口的定义是,看到红色箱子(接口的GUID)向后数5个各自就是橘子,那么以上两个不同的类只要继承这个定位方法,就可以让CPU顺利找到橘子了,和他的派生自哪个类没半毛钱关系,接口虽然没有实现任何内容,但它明确给出了函数定位方式,在GUID后偏移4个字节就是第一个接口成员函数的函数指针,以此类推,那么继承者也会按这个规则编译接口函数指针地址,那么共性就有了。。
mk_lucifer 2018-02-08
  • 打赏
  • 举报
回复
接口的用途非常广而且很重要,它主要是保证继承自不同基类的派生类能够增加一些共同特性,一个人可以不可以8条腿,在人的基类里定义是不能的,因为只有两条。。如果某件事情要求很简单,你要有8条腿就可去做,并不关心你继承自哪个基类,那么由于继承自不同基类的派生类没有共性,想让他们有,另一个办法就是继承一个接口,人装6个假肢就行了,但螃蟹也要继承这个接口,但不用装假肢,这个接口就是他们的共性。。。在程序中代码对于函数调用不是根据函数名的而是地址偏移,这要切记,接口可以锁定地址偏移(这是为什么在Dilphi里接口要有GUID的原因),继承自不同类型的派生类,就算有两个从名称到参数完全相同的函数,他也不是他们之间的共性,只能说是代码上撞衫了,源码是源码,但机器码只人地址,不能有效定位地址那就没法运行,具有相同特性就是在统一个偏移量上有相同功能的函数或变量,名字不是机器码中所具有的特性。。。。
xiaocongzhi 2018-02-05
  • 打赏
  • 举报
回复
接口是给客户端调用时 让其遵守你的规范,具体服务端可以根据具体情况 来做不同的实现 ,这样便于以同一种规范来调用,也就是所谓的去除藕合
DelphixpeFan 2018-02-04
  • 打赏
  • 举报
回复
个人理解,接口定义只是类功能扩展的一个说明,在被继承的类中,没有具体的实现方法,所以,没有override关键字,但继承该接口的类必须提供实现该接口的方法(即使仅仅只有一对begin end),所以,后面必须再声明一次;一个类被继承时,可以有多种接口,生成不同新类,当然也可以没有接口,这样只是给类改了个名字而已,或者通过覆盖父类的方法,在原有类的功能基础上加强功能而生成新类,象Form1 = Class(TForm)就是一个不带接口类的继承;另一个理解是,接口也是一个类,只是一个抽象类,没有现成的实现方法(不象真正的类,本来就带有实现方法),只是给了个名字给你,要怎么实现看你的本事,继承只是将两个类打包成一个拥有更多功能的类,被继承的接口和被继承的类应该没啥大的关系,反而跟继承它的类有很大的关系。
SupermanTm 2018-01-16
  • 打赏
  • 举报
回复
引用 7 楼 DelphiGuy 的回复:
与windows没有多少关系,虽然最初接口出现的时候是为了简化基于COM的程序设计(在D5中,最基本的接口是IUnknown,显然是COM相关的),不过从D6开始,基本接口已经变成了IInterface,是基础语言特性。
COM 本身就是当初 Microsoft 为 Visual Basic 3.0 制订的控件规范,如果从效率上看,COM 被VCL秒得渣都不剩了,不过,Microsoft 毕竟控制了基础平台,所以就又搞个 DCOM 出来忽悠呗
xiaocongzhi 2018-01-01
  • 打赏
  • 举报
回复
其实接口只是对某个对象开个口子,这个口子里包含你可以给调用方(客户端)访问的一些方法或者属性
kenlewis 2017-12-28
  • 打赏
  • 举报
回复
其实我觉得a295281315已经讲的很清楚了。父类里声明的这些函数或者属性,只是表示它有这些。子类里再声明一次是具体的描述。 可以这么理解,汽车都有方向盘,所以在汽车类里我要声明一个方向盘。而对于奥迪而言,它也有方向盘,所以在奥迪里我还要声明一个方向盘。因为奥迪的方向盘和汽车的方向盘是一样的东西,所以奥迪就从汽车的类中继承一下方向盘,本田车也可以继承这个方向盘,并且各自都可以给自己的方向盘加一些个性化的功能或者属性。奥迪方向盘的个性化的部分,在汽车这个类的方向盘里是没有的。 如果汽车类不声明方向盘,也就是说汽车这一类是没有方向盘的。那么奥迪车就要自己定义方向盘,本田车也要定义自己的方向盘。每种车都要定义自己的方向盘。虽然对于每种车而言,没什么影响,但是对于汽车这一类来说,就没有方向盘了。未来,假如我们需要描述“通过方向盘可以控制汽车行进的方向”,就无法做到了。
  • 打赏
  • 举报
回复
与windows没有多少关系,虽然最初接口出现的时候是为了简化基于COM的程序设计(在D5中,最基本的接口是IUnknown,显然是COM相关的),不过从D6开始,基本接口已经变成了IInterface,是基础语言特性。
SupermanTm 2017-12-28
  • 打赏
  • 举报
回复
其实就Delphi的VCL架构采用继承/委托这样的结构基本是完全能涵盖“接口”这样的概念了,不过,“接口”本质上是Windows体系里的,也就是微软的利器,既然你要开发For Windows的应用程序嘛,那当然要妥协的啦。
Mr Dang 2017-10-18
  • 打赏
  • 举报
回复
就像 单词是一个一个字母组成的,奥迪类是继承的 接口和基础类 ,把具有共有行为的定义成接口、把具有共有属性、方法的定义成类,然后他们结合生成具体的类(奥迪、宝马、奔驰类 ) 。 这些概念比较抽象 ,讲不好
Mr Dang 2017-10-18
  • 打赏
  • 举报
回复
引用 2 楼 u011653354 的回复:
引用 1 楼 a295281315 的回复:
接口只是规定行为,只是规定 只是规定,由调用这个接口的类去实现 。 百度一下 接口 和 类的定义 。。。
那我不要也一样可以实现,为什么要这么多此一举呢
不要是可以实现, 可能调用这个车接口的实现类有很多 ,有奥迪 、宝马、奔驰 ,但是他们都有启动 停止 刹车行为 ,把这些行为抽象成接口 ,再新增车型类的时候 ,就可以直接继承这个接口 ,规范化新增车型的行为(都叫启动 停止 刹车 而不是叫奥迪叫启动123 宝马叫 启动345)。
日月路明 2017-10-17
  • 打赏
  • 举报
回复
TAodiQ7是接口的实现类,这不是类的继承,不要用类的思维方法,接口可以多重继承,但delohi类不可以多重继承,为什么用接口,这不是三言两语能说明的,可以简单的理解接口的抽象级别更高,至于什么时候用接口没什么时候用类,只能慢慢体会,只可意会不可言传
郁闷的坦然 2017-10-17
  • 打赏
  • 举报
回复
引用 1 楼 a295281315 的回复:
接口只是规定行为,只是规定 只是规定,由调用这个接口的类去实现 。 百度一下 接口 和 类的定义 。。。
那我不要也一样可以实现,为什么要这么多此一举呢
Mr Dang 2017-10-14
  • 打赏
  • 举报
回复
接口只是规定行为,只是规定 只是规定,由调用这个接口的类去实现 。 百度一下 接口 和 类的定义 。。。

5,379

社区成员

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

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