Delphi重要语法和OO特性——汽车类作业
? 编写汽车类,要求有汽车、方向盘、车身、发动机、刹车等几个类。
? 模拟一次从启动到结束的过程,并输出汽车的状态变化。
? 同时实现几类汽车:奥迪A4、奔驰C200、奥迪Q7
思考:
1、将方向盘、车身、发动机、刹车分别写成一个类;
2、以上类是汽车类的成员;
3、为汽车添加启动、行驶、停止等过程函数,声明为virtual;
4、奥迪A4、奔驰C200、奥迪Q7分别继承自汽车类,并重写override汽车的启动、行驶、停止等过程函数。
类列举:
方向盘类:
{----------------------------------------- Unit Name: SteeringWheel Author: huyp Date: 06-八月-2012 Purpose: 汽车部件类方向盘类 History: V1.0-----------------------------------------}unit SteeringWheel;interface {SteeringWheel 方向盘类} type TSteeringWheel = class private diameter : real; //方向盘直径 material : string; public { Public declarations } end;implementationend.车身类:
{----------------------------------------- Unit Name: CarBody Author: huyp Date: 06-八月-2012 Purpose: 汽车部件类车身类 History: V1.0-----------------------------------------} unit CarBody;interface{CarBody 车身} type TCarBody = class private color : string; style : string; length : real; weight : real; public { Public declarations } end;implementationend.发动机类:
{----------------------------------------- Unit Name: Engine Author: huyp Date: 06-八月-2012 Purpose: 汽车部件类发动机类 History: V1.0-----------------------------------------}unit Engine;interface{engine 发动机 } type TEngine = class private numOfCylinder : integer; //气缸数目 numOfAirValve :integer; //气门数目 Power : real; public { Public declarations } end;implementationend.刹车类:
{----------------------------------------- Unit Name: Brake Author: huyp Date: 06-八月-2012 Purpose: 汽车部件类刹车类 History: V1.0-----------------------------------------}unit Brake;interface{Brake 刹车 } type TBrake = class private safety : real; //安全系数 public { Public declarations } end;implementationend.汽车类:
{----------------------------------------- Unit Name: BaseCar Author: huyp Date: 06-八月-2012 Purpose: BaseCar类是基本的汽车类,具有汽车的一般属性,是其它汽车类的基类 History: V1.0-----------------------------------------}unit BaseCar;interfaceuses Messages, Brake, CarBody, SteeringWheel, Engine, Dialogs;{汽车类}type TCar = class private name : string; size : string; manufacture : string; price : real; public { Public declarations } huypSteeringWheel : TSteeringWheel; //方向盘类对象 huypCarBody : TCarBody; //车身类对象 huypEngine : TEngine; //发动机类对象 huypBrake : TBrake; //刹车类对象 procedure starting; virtual; //模拟汽车启动函数,可被子类override procedure driving; virtual; //模拟汽车行驶函数,可被子类override procedure stopping; virtual; //模拟汽车停止函数,可被子类override end;implementationvar huypCar : TCar;{----------------------------------------- Procedure: starting Author: huyp Date: 06-八月-2012 Arguments: None Result: None Funtion: 模拟汽车启动-----------------------------------------}procedure TCar.starting; begin MessageDlg('This is a car, it''s time to go', mtInformation, [mbOK, mbCancel], 0); end;{----------------------------------------- Procedure: driving Author: huyp Date: 06-八月-2012 Arguments: None Result: None Funtion: 模拟汽车行驶-----------------------------------------} procedure TCar.driving; begin MessageDlg('This is a car, it''s driving', mtInformation, [mbOK], 0); end;{----------------------------------------- Procedure: stopping Author: huyp Date: 06-八月-2012 Arguments: None Result: None Funtion: 模拟汽车停止-----------------------------------------} procedure TCar.stopping; begin MessageDlg('This is a car, it''s stopping', mtInformation, [mbOK], 0); end;end.以下类继承自汽车类:
奥迪A4:
{----------------------------------------- Unit Name: AudiA4 Author: huyp Date: 06-八月-2012 Purpose: 继承自BaseCar的AudiA4,继承一般汽车的属性之外,重载了BaseCar 的启动,行驶和停止功能 History: V1.0-----------------------------------------}unit AudiA4;interfaceuses BaseCar, Dialogs;{AudiA4}type TAudiA4 = class(TCar) private procedure starting; override; //重写汽车启动函数 procedure driving; override; //重写汽车行驶函数 procedure stopping; override; //重写汽车停止函数 public { Public declarations } end;implementationvar myAudiA4 : TAudiA4;{----------------------------------------- Procedure: starting Author: huyp Date: 06-八月-2012 Arguments: None Result: None Function: 模拟AudiA4启动函数-----------------------------------------}procedure TAudiA4.starting;begin MessageDlg('This is AudiA4, it''s time to go', mtInformation, [mbOK, mbCancel], 0); end;{----------------------------------------- Procedure: driving Author: huyp Date: 06-八月-2012 Arguments: None Result: None Function: 模拟行驶启动函数-----------------------------------------} procedure TAudiA4.driving; begin MessageDlg('This is AudiA4, it''s time to go', mtInformation, [mbOK, mbCancel], 0); end;{----------------------------------------- Procedure: stopping Author: huyp Date: 06-八月-2012 Arguments: None Result: None Function: 模拟AudiA4停止函数-----------------------------------------} procedure TAudiA4.stopping; begin MessageDlg('This is AudiA4, it''s time to go', mtInformation, [mbOK, mbCancel], 0); end;end.奔驰C200:
{----------------------------------------- Unit Name: BenzC200 Author: huyp Date: 06-八月-2012 Purpose: 继承自BaseCar的BenzC200,继承一般汽车的属性之外,重载了BaseCar 的启动,行驶和停止功能 History: V1.0-----------------------------------------}unit BenzC200;interfaceuses BaseCar, Dialogs;{BenzC200}type TBenzC200 = class(TCar) private procedure starting; override; //重写汽车启动函数 procedure driving; override; //重写汽车行驶函数 procedure stopping; override; //重写汽车停止函数 public { Public declarations } end;implementationvar myBenzC200 : TBenzC200;{----------------------------------------- Procedure: starting Author: huyp Date: 06-八月-2012 Arguments: None Result: None Function: 模拟BenzC200启动函数-----------------------------------------}procedure TBenzC200.starting; begin MessageDlg('This is BenzC200, it''s time to go', mtInformation, [mbOK, mbCancel], 0); end;{----------------------------------------- Procedure: driving Author: huyp Date: 06-八月-2012 Arguments: None Result: None Function: 模拟BenzC200行驶函数-----------------------------------------} procedure TBenzC200.driving; begin MessageDlg('This is BenzC200, it''s time to go', mtInformation, [mbOK, mbCancel], 0); end; {----------------------------------------- Procedure: stopping Author: huyp Date: 06-八月-2012 Arguments: None Result: None Function: 模拟BenzC200停止函数-----------------------------------------} procedure TBenzC200.stopping; begin MessageDlg('This is BenzC200, it''s time to go', mtInformation, [mbOK, mbCancel], 0); end;end.奥迪Q7:
{----------------------------------------- Unit Name: AudiQ7 Author: huyp Date: 06-八月-2012 Purpose: 继承自BaseCar的AudiQ7,继承一般汽车的属性之外,重载了BaseCar 的启动,行驶和停止功能 History: V1.0-----------------------------------------}unit AudiQ7;interfaceuses BaseCar, Dialogs; {AudiQ7}type TAudiQ7 = class(TCar) private procedure starting; override; //重写汽车启动函数 procedure driving; override; //重写汽车行驶函数 procedure stopping; override; //重写汽车停止函数 public { Public declarations } end;implementationvar myAudiQ7 : TAudiQ7;{----------------------------------------- Procedure: starting Author: huyp Date: 06-八月-2012 Arguments: None Result: None Function: 模拟AudiQ7启动函数-----------------------------------------}procedure TAudiQ7.starting; begin MessageDlg('This is AudiQ7, it''s time to go', mtInformation, [mbOK, mbCancel], 0); end;{----------------------------------------- Procedure: driving Author: huyp Date: 06-八月-2012 Arguments: None Result: None Function: 模拟AudiQ7行驶函数-----------------------------------------} procedure TAudiQ7.driving; begin MessageDlg('This is AudiQ7, it''s time to go', mtInformation, [mbOK, mbCancel], 0); end;{----------------------------------------- Procedure: stopping Author: huyp Date: 06-八月-2012 Arguments: None Result: None Function: 模拟AudiQ7停止函数-----------------------------------------} procedure TAudiQ7.stopping; begin MessageDlg('This is AudiQ7, it''s time to go', mtInformation, [mbOK, mbCancel], 0); end;end.主窗口中对这些类的相关方法进行调用:
{----------------------------------------- Unit Name: myCar Author: huyp Date: 06-八月-2012 Purpose: 分别调用TBaseCar TAudiA4 TAudiQ7 TBenzC200类模拟汽车过程 History: V1.0-----------------------------------------}unit myCar;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Brake, CarBody, SteeringWheel, Engine, BaseCar, AudiA4, AudiQ7, BenzC200;type TCarForm = class(TForm) btnCarProcess: TButton; //一般汽车操作按钮 btnAudiA4: TButton; //AudiA4操作按钮 btnBenzC200: TButton; //BenzC200操作按钮 btnAudiQ7: TButton; //AudiQ7操作按钮 procedure btnAudiA4Click(Sender: TObject); //模拟奥迪A4流程 procedure btnAudiQ7Click(Sender: TObject); //模拟奥迪Q7流程 procedure btnBenzC200Click(Sender: TObject); //模拟奔驰C200流程 procedure btnCarProcessClick(Sender: TObject); //模拟一般汽车流程 private { Private declarations } public { Public declarations } end;var CarForm: TCarForm; huypCar : TCar;implementation{$R *.dfm}{----------------------------------------- Procedure: btnAudiA4Click Author: huyp Date: 06-八月-2012 Arguments: Sender: TObject Result: None Function: 模拟奥迪A4从启动到停止的流程,调用 TAudiA4类的成员方法-----------------------------------------}procedure TCarForm.btnAudiA4Click(Sender: TObject);var myAudiA4 : TAudiA4;begin myAudiA4 := TAudiA4.Create; myAudiA4.starting; myAudiA4.driving; myAudiA4.stopping; myAudiA4.Free;end;{----------------------------------------- Procedure: btnAudiQ7Click Author: huyp Date: 06-八月-2012 Arguments: Sender: TObject Result: None Function: 模拟奥迪Q7从启动到停止的流程,调用 TAudiQ7类的成员方法-----------------------------------------}procedure TCarForm.btnAudiQ7Click(Sender: TObject);var myAudiQ7 : TAudiQ7;begin myAudiQ7 := TAudiQ7.Create; myAudiQ7.starting; myAudiQ7.driving; myAudiQ7.stopping; myAudiQ7.Free;end;{----------------------------------------- Procedure: btnBenzC200Click Author: huyp Date: 06-八月-2012 Arguments: Sender: TObject Result: None Function: 模拟BenzC200从启动到停止的流程,调用 TBenzC200类的成员方法-----------------------------------------}procedure TCarForm.btnBenzC200Click(Sender: TObject);var myBenzC200 : TBenzC200;begin myBenzC200 := TBenzC200.Create; myBenzC200.starting; myBenzC200.driving; myBenzC200.stopping; myBenzC200.Free;end;{----------------------------------------- Procedure: btnCarProcessClick Author: huyp Date: 06-八月-2012 Arguments: Sender: TObject Result: None Function: 模拟car从启动到停止的流程,调用 TCar类的成员方法-----------------------------------------}procedure TCarForm.btnCarProcessClick(Sender: TObject);var myCar : TCar;begin myCar := TCar.Create; myCar.starting; myCar.driving; myCar.stopping; myCar.Free;end;end.编码规范:
1、将方向盘、车身、发动机、刹车、汽车、奥迪A4、奔驰C200、奥迪Q7都写在一个单独Unit文件中;
2、命名
1)单元文件命名要有意义;
2)控件命名要根据编码规范,例如按钮前缀btn
3)类的命名要加上T,表示它是一个模型;
3、注释
1)每个Unit文件都添加头注释;
2)每个变量声明、函数声明都要添加注释;
3)过程和函数的实现按照GExpert函数标准添加注释;
遇到的问题:
1、怎样将若跟个Unit文件中的类联系起来,互相调用?
在uses后面添加相应的单元文件名称即可。
2、这些类都有哪些参数?
自由发挥,查资料。