父类属性读写方法怎么由子类实现? ( 积分: 100 )

  • 主题发起人 主题发起人 盛利
  • 开始时间 开始时间

盛利

Unregistered / Unconfirmed
GUEST, unregistred user!
咨询一个问题,父类有一个属性
其读和写方法要由继承子类来实现
怎么实现?
例如:
Tfather
private
m_ege:integer;
procedure Setege(Value: integer)

published
property ege:read m_ege write setege;
end

Tchild
private
m_ege:integer;
procedure Setege(Value: integer)

published
property ege:read m_ege write setege;
end

如果这样定义
example:Tchild;
Tfather(example).ege =14


这里我需要执行Tchild的Setege
调用方法不能修改,类的设计是可以修改的
虚方法在这样的调用是可以的,我就想实现虚方法那样的,不知道有没有虚属性?
 
咨询一个问题,父类有一个属性
其读和写方法要由继承子类来实现
怎么实现?
例如:
Tfather
private
m_ege:integer;
procedure Setege(Value: integer)

published
property ege:read m_ege write setege;
end

Tchild
private
m_ege:integer;
procedure Setege(Value: integer)

published
property ege:read m_ege write setege;
end

如果这样定义
example:Tchild;
Tfather(example).ege =14


这里我需要执行Tchild的Setege
调用方法不能修改,类的设计是可以修改的
虚方法在这样的调用是可以的,我就想实现虚方法那样的,不知道有没有虚属性?
 
把写方法放到protected或public里,然后设成虚方法或抽象方法都可以
 
Tfather
private
m_ege:integer;
protected
procedure Setege(Value: integer)
abstract;
published
property ege:read m_ege write setege;
end

建议读读<<delphi高手突破>>
 
你还不如直接把
example:Tfather;
这样不就直接可以调用父类的方法了。
当需要用到子方法时,再
example:=tchild.create;
Tchild(example).ege =14;
这样还方便控制一些的。

另外你也可以在子类中这样做试试
Tfather
private
m_ege:integer;
protected
procedure Setege(Value: integer)
virtual;
published
property ege:read m_ege write setege;
end


Tchild
private
m_ege:integer;
protected
procedure Setege(Value: integer)
overload
override;
procedure Setege(Value: string)
reintroduce
overload
//这个参数设为与上面不同参数的形式。
published
。。。。。。。
end;
还有,你可参看一下这个贴子的
http://delphibbs.timeboat.net:8080/delphibbs/dispq.asp?lid=1448791
类的继承---跨过中间类,继承祖先类的方法
 
app2001:你的整个部分是什么意思,为什么这么做
procedure Setege(Value: integer)
overload
override;
procedure Setege(Value: string)
reintroduce
overload
//这个参数设为与上面不同参数的形式。

 
我不赞成app2001的看法
我觉得这样做不符合程序模块化设计的思想
不是太好的习惯
现在对这个问题已经有了比较成体系的解决方法了
 
<<delphi高手突破>><<delphi高手突破>><<delphi高手突破>><<delphi高手突破>><<delphi高手突破>><<delphi高手突破>><<delphi高手突破>><<delphi高手突破>><<delphi高手突破>><<delphi高手突破>><<delphi高手突破>><<delphi高手突破>><<delphi高手突破>><<delphi高手突破>><<delphi高手突破>><<delphi高手突破>><<delphi高手突破>><<delphi高手突破>><<delphi高手突破>><<delphi高手突破>><<delphi高手突破>><<delphi高手突破>><<delphi高手突破>><<delphi高手突破>><<delphi高手突破>>
 
Tfather = Class(Tobject)
private
m_ege:integer;
protected
procedure Setege(Value: integer)
virtual
abstract;
published
property ege:read m_ege write setege;
end

Tchild = Class(Tfather)
Public
procedure Setege(Value: integer)
override;
end

这样定义
example:Tchild;
example.ege =14;
这样应该就可以了
 
type
Tfather = Class(Tobject)
private
m_ege: integer;
protected
procedure Setege(Value: integer)
virtual
abstract;
published
property ege: integer read m_ege write Setege;
end;

Tchild = Class(Tfather)
protected
procedure Setege(Value: integer)
override;
end;

TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
example: Tchild;
public
{ Public declarations }
end;


var
Form1: TForm1;

implementation

{$R *.dfm}


procedure Tchild.Setege(Value: integer);
begin
m_ege:= Value;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
example.ege:= strtoint(trim(Edit1.Text));
Edit2.Text:= inttostr(example.ege);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
example:= Tchild.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
example.Free;
end;
 
来自:cst_zf, 时间:2005-2-22 20:02:06, ID:2994478
我不赞成app2001的看法
我觉得这样做不符合程序模块化设计的思想
不是太好的习惯
现在对这个问题已经有了比较成体系的解决方法了

我事后也觉得这样做有些牵强的,你所说的较成体系的方法是怎么进行的呢?
另外,我看到这样一段代码,用这样的方式,你认为如何呢???
procedure Tmain.WMSysCommand(var msg: TMessage);
begin
if msg.WParam = SC_MINIMIZE then //用这个参数来判断执行子类代码还是父类代码
begin
showwindow(application.handle,sw_hide);
end else inherited;
end;
 
成体系的方法 就是 当一个方法必须声明而无法实现时声明在父类中而在子类中覆盖
当一个方法在父类中可以实现而在子类中需要扩展是用你上面写的这个方法
判断是否属子类扩展,是则处理,不是则inherited
另外对于本贴的问题,m_age如果需要被子类的方法调用,如果不声明在同一个单元中
(友元)的话必须写在Protected中,或在父类中放一个专门给它赋值的Protected方法
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
608
import
I
后退
顶部