"车,汽车,货车"的类继承的问题 ( 积分: 100 )

  • 主题发起人 主题发起人 whqsoft
  • 开始时间 开始时间
W

whqsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
类继承的问题
我举个例子,定义一个“车”类(非结口),汽车,货车 都是“车”类的子类。
我现在有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;
请教一下各位高手有没有什么更好的办法??
 
类继承的问题
我举个例子,定义一个“车”类(非结口),汽车,货车 都是“车”类的子类。
我现在有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;
请教一下各位高手有没有什么更好的办法??
 
子类可以继承父类的所有特性,还可以指定其自己本身的特有属性吧!
我是新手,理解也不太透彻,呵呵``
 
车=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 9do
begin

汽车.Create;
货车.Create;
end;
 
车怎么能改造成汽车呢?他具备汽车足够的属性吗?同样具备货车足够的属性吗?
 
子类可以转换成为父类
因为子类里边包括父类的所有成员
但是父类却不能转换为子类
所以你的想法不对 不是一开始就创建20辆车 而应该分别创建10辆汽车和10辆货车
 
汽油箱是汽车的。车是没有这个属性的。当然无法得到。
可以车(汽车),反过来可不行
 
如果一开始就建10辆汽车和10辆货车 我就不用在转换了
 
看这样代码如何:[: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;
 
你是想达到什么目的?
 
楼上的英语太好了,这种办法不错,
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;
 
不要用继承,用组合
汽车=class
v1: 车;
汽油箱:TObject
procedure TakeManyPeople;
end;
 
后退
顶部