菜鸟请教一个简单的问题。(30分)

  • 主题发起人 主题发起人 dajiangxu
  • 开始时间 开始时间
D

dajiangxu

Unregistered / Unconfirmed
GUEST, unregistred user!
在delphi类与对象中,构造函数是用来初始化对象的。但在程序中什么时候需要用,什么时候不需要用啊?
下面的类子中,学生类和工人类都是人类的子类,为什么工人类需要用到构造函数而学生类不需要啊?请各位帮我解答一下,谢谢!
t y p e
THuman = class // 人类
p r i v a t e
Age:Integer; // 年龄
p u b l i c
Name:string; // 姓名
function GetAge:Integer; // 获取年龄
procedure SetAge(A:Integer); // 设置年龄
e n d ;

TStudent = class(THuman) // 学生类
p u b l i c
SchoolName:string; // 学校名称
procedure ShowInf; // 显示学生信息
e n d ;

T Worker = class(THuman) // 工人类
p u b l i c
Wage:Double; // 薪水
constructor Create(W: D o u b l e ) ;
destructor Destroy;override;
e n d ;


function THuman.GetAge:Integer; // 获取人员的年龄
b e g i n
R e s u l t : = A g e ;
e n d ;
procedure THuman.SetAge(A:Integer); // 设置人员的年龄
b e g i n
A g e : = A ;
e n d ;
procedure TStudent.ShowInf; // 显示学生的信息
b e g i n
Wr i t e l n ( '姓名:',Name,' 年龄:',GetAge,' 学校:' , S c h o o l N a m e ) ;
e n d ;
constructor TWo r k e r. C r e a t e ( W:Double); // 工人类的构造函数
b e g i n
inherited Create; // 调用父类的构造函数
Wr i t e l n ( '调用工人类的构造函数。' ) ;
Wa g e : = W;
e n d ;
destructor TWo r k e r.Destroy; // 工人类的析构函数
b e g i n
Wr i t e l n ( '姓名为:',Name,' 的工人类对象被删除。' ) ;
inherited Destroy; // 调用父类的析构函数
e n d ;
v a r
S1: TStudent; // 声明一个学生类的变量
W1: TWorker; // 声明一个工人类的变量
b e g i n
S1:=TStudent.Create; // 调用默认的构造函数创建对象
S 1 . N a m e : = '王松' ;
S 1 . S e t A g e ( 9 ) ;
S 1 . S c h o o l N a m e : = '树人小学' ;
S1.ShowInf; // 显示学生信息
S1.Destroy; // 调用默认的析构函数
W 1 : = T Wo r k e r.Create(1925.62); // 调用构造函数创建对象
W 1 . N a m e : = '陈建辉' ;
W 1 . A g e : = 2 6 ;
// 显示工人信息
Wr i t e l n ( '姓名:',W1.Name,' 年龄:',W1.Age,' 月薪:' , W 1 . Wa g e ) ;
W1.Destroy; // 调用自定义的析构函数
e n d .
 
我知道对各位高手来说这个问题太简单了,但能不能帮我指点一下?谢谢了!
 
不需要
是默认继承了TObject的Create。
 
是对象不需要初始化吗?也就是说这边的构造函数可有可无啊?
 
工人类的构造函数和祖先类的不一样:
constructor Create(W: D o u b l e ) ;
是自己定义的带参数的构造函数,
如果不改变祖先类的构造函数,不用重写这个函数。
 
use Create。
 
happycyp,我意思是集合这个例子,向你们请教一下什么时候该用构造函数,什么时候不需要用?
 
前面不是说了吗?如果需要改变父类的构造函数,加上自己的东东,就要覆盖它。这时候要在子类中重写构造函数。
类似这样:
constructor TWorker.Create(S : string);//
begin
inherited Create; // 调用父类的构造函数
dosomething(s) ;//用参数s进行一些设置。
end;

如果不改变构造函数,则不用重写。
 
happycyp,说的没错
 
为什么工人类需要用到构造函数而学生类不需要啊?
你这句话是完全错误的!
谁说子类不需要?
你是子类是不是用了继承?
inherited Create;
用了这句就是用到构造函数;
如果你想在子类创建时加入某些变量不就还要在constructor Create中
加入一些其它的语句吗?
 
happycyp谢谢你,请问父类的构造函数是什么样子啊?呵呵,不好意思,我刚接触。
 
多写写控件就好了!
 
清新空气,谢谢你。你的意思是只要在子类中加入一些变量都需要用构造函数了?
 
我一定好好学了。我刚从学校出来,现在单位要用delphi开发。
 
找本面向对象编程的基础书,看看,你就知道了。
 
总之我的感觉不是象楼上所说的!我觉得多写写代码!有点基础了再去看书!
否则就象看天书一样!我深有体会!一本书看了N遍,每次看收获都不同!
constructor 子类.Create;//只是从父类继承,此时没有任何其它处理
begin
inherited Create;
end;
constructor 子类.Create;override;
constructor 子类.Create;//此时覆盖父类的方法
begin
inherited Create;//继承父类的创建,否则子类没有意思!因为父没有创建哪儿有子?
子类变量1:=nil;
子类变量2:='你好!';
end;
等等还有重载(overload),虚方法(virtual)virtual的方法必须是已经实现的方法
而abstract指抽象的方法,必须由派生类来实现
override,overload,virtual,dynamic
都是方法修饰,跟在方法定义的后面,
overload指方法重载,及同样的名字的函数可以有不同的形式,参数表
可以和其他的配合使用,用来实现函数的多态性
override 表示覆盖,即用新的方法实现代替父类的对应方法
如果要在实现中调用父类的方法,可以用inherited; 后面也可以加上调用的
参数,如果参数表相同,则可以仅用一个inherited;语句就可以了
在消息过程中也可以使用inherited 表示调用父类的此消息的代码
virtual,abstract 都是定义虚方法,但是前者已经部分实现,后者需要派生类来实现
dynamic 也用来定义虚方法,但他不采用虚拟方法表来实现,用速度来换取空间
对于有大量需要覆盖的对象来说,适合用dynamic,Delphi;
 
清新空气,谢谢你。我现在想把delphi连接数据库、执行sql操作写成一个类,以后直接调用。但现在都不知道从哪儿下手!
 
首先要设计好!
1、如连接数据库要传入哪些参数?
2、数据库连接成功否是否返回个值?
3、连接数据库还执行sql,那么是用哪里的数据集对象,是动态创建还是以参数形式传入一个程序中的数据集对象?
....
 

谢谢
看来挺烦的啊!
 

Similar threads

后退
顶部