汽车类继承的问题

标签: constructorintegerclassbutton制造
2082人阅读 评论(0) 收藏 举报
分类:

类继承的问题
我举个例子,定义一个“车”类(非结口),汽车,货车 都是“车”类的子类。
我现在有20辆车,其中10改造成汽车,10改造成货车。这样的继承关系怎样实现??
车=CLASS
public
 车轮:TObject;
 procedure Move;
 procedure Stop;
 procedure AddOil;
 procedure Create;
end;
汽车=CLASS(车)
public
 汽油箱:TObject
 procedure TakeManyPeople;
end;
货车=Class(车)
public
 货箱:TObject
 procedure TakeManythings;
end;
Procedure 车.Create()
begin
车轮.Create();
end;
Procedure 汽车.Create()
begin
汽油箱.Create();
end;
Procedure 汽车.Create()
begin
货箱.Create();
end;
汽车1:=汽车(车1);
汽车1.汽油箱 (这个对象就不存在)

想了几天只想到一个办法
Create 汽车;
汽车.Assign(车);
车.Delete;
请教一下各位高手有没有什么更好的办法??

来自: SnakeArl, 时间: 2005-10-27 10:32:01, ID: 3245530

子类可以继承父类的所有特性,还可以指定其自己本身的特有属性吧!
我是新手,理解也不太透彻,呵呵``

来自: mmzmagic, 时间: 2005-10-27 10:35:32, ID: 3245536

车=CLASS
public
 procedure Move;
 procedure Stop;
 procedure AddOil;
end;
 
汽车=CLASS(车)
public
 procedure TakeManyPeople;
end;
货车=Class(车)
public
 procedure TakeManythings;
end;

=============
var
 i:integer;
for i:=0 to 9 do  begin
 汽车.Create;
 货车.Create;
end;

来自: 总有爱, 时间: 2005-10-27 10:36:27, ID: 3245539

车怎么能改造成汽车呢?他具备汽车足够的属性吗?同样具备货车足够的属性吗?

来自: mmzmagic, 时间: 2005-10-27 10:37:38, ID: 3245542

子类可以转换成为父类
因为子类里边包括父类的所有成员
但是父类却不能转换为子类
所以你的想法不对 不是一开始就创建20辆车 而应该分别创建10辆汽车和10辆货车

来自: wwr74, 时间: 2005-10-27 11:13:31, ID: 3245615

汽油箱是汽车的。车是没有这个属性的。当然无法得到。
可以车(汽车),反过来可不行

来自: whqsoft, 时间: 2005-10-27 11:18:16, ID: 3245632

如果一开始就建10辆汽车和10辆货车  我就不用在转换了

来自: wrl_001, 时间: 2005-10-27 11:32:08, ID: 3245668

看这样代码如何:[:D]
type
 TVehicle=class
 public
   Field1:Integer;
   Field2:Integer;
   constructor Create;
 end;
 TCar=class(TVehicle)
 public
   Field3:Integer;
   constructor Create(ReBuild:TVehicle);virtual;
 end;
 TTruck=class(TVehicle)
 end;
 TForm1 = class(TForm)
   Button1: TButton;
   Label1: TLabel;
   Label2: TLabel;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

{ TCar }

constructor TCar.Create(ReBuild: TVehicle);
begin
 Field1:=Rebuild.Field1;
 if Rebuild.Field2=2 then
   Field2:=20  //进行改造
 else Field2:=25;
 Field3:=30;
 ReBuild.Free;
end;

{ TVehicle }

constructor TVehicle.Create;
begin
 Field1:=1;
 Field2:=2;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 ves:array[0..9] of TVehicle;
begin
 ves[0]:=TVehicle.Create;
 ves[0]:=TCar.Create(ves[0]);
 ves[1]:=TVehicle.Create;
 ves[1].Field2 :=3;
 ves[1]:=TCar.Create(ves[1]);
 label1.Caption :=inttostr(ves[0].Field2);
 label2.Caption :=inttostr(ves[1].Field2);
 ves[0].Free;
 ves[1].Free;
end;

来自: bluesaga, 时间: 2005-10-27 12:55:30, ID: 3245765

你是想达到什么目的?

来自: whqsoft, 时间: 2005-10-27 16:18:56, ID: 3246108

楼上的英语太好了,这种办法不错,
constructor TCar.Create(ReBuild: TVehicle);
 Field1:=Rebuild.Field1;
 ReBuild.Free;
最后还是要把ReBuild.free,实际上制造了40车辆。
thank 大家!!!!! 我的目的是:
我写了一个程序,程序里的类都是从xmlNode继承过来的,我用xmldoc.loadfromfile();
以后,这些结点都已创建出来了(也就是20辆车有了),但是我要后面我要把它变成
汽车,汽车类
看了大家给我这么多帮助,我觉得楼上写的方法不错,我决定这样写:
汽车1=汽车.create();
汽车1.assign(xmlnode1);
汽车1.Replace(xmlNode1);
xmlNode1.free;

来自: wwa, 时间: 2005-11-13 20:46:44, ID: 3264364

不要用继承,用组合
汽车=class
 v1: 车;
 汽油箱:TObject
 procedure TakeManyPeople;
end;

问题讨论没有结束 ...


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    关注我谢谢。

    欢迎扫描关注我的公众号。


    公众号二维码
    个人资料
    • 访问:1107790次
    • 积分:12443
    • 等级:
    • 排名:第1120名
    • 原创:184篇
    • 转载:22篇
    • 译文:18篇
    • 评论:451条
    博客专栏
    最新评论