菜鸟级问题:请问如何重载一个属性? --by 萧月禾(300分)

  • 主题发起人 萧月禾
  • 开始时间

萧月禾

Unregistered / Unconfirmed
GUEST, unregistred user!
比如我有2个窗体单元:

Unit1.pas

TBase = class
public
abc: string;
procedure Show1;
end;

TForm1 = class(TForm)
procedure Button1Click(Sender: TObject);//这里调用Base的show1
procedure FormCreate(Sender: TObject);//这里创建Base对象
public
property Base: TBase ... //定义TBase的对象变量
end;


Unit2.pas

TBase1 = class(TBase) //从Unit1的
public
procedure Show2;
end;

TForm2 = class(TForm1)
procedure Button2Click(Sender: TObject);//这里调用Base的show1
procedure FormCreate(Sender: TObject);//这里创建Base对象,不用inherited
public
property Base: TBase1 ... //重新用TBase1定义Base对象变量
end;

问,如何重载这个Base属性,让它原来在TForm1下的所被调用的命令仍然有效,同时又可以在TForm2中使用TBase1的命令。
不要创建成2个不想干的对象。
 
Base: TBase;overload;
 
属性override好象没有见到过,但你可以定义成共同的祖先类,然后再转化它们。比如:
Unit1.pas

TBase = class
public
abc: string;
procedure Show;virtual;
end;

TForm1 = class(TForm)
procedure Button1Click(Sender: TObject);//这里调用Base的show
procedure FormCreate(Sender: TObject);//这里创建Base对象
public
property Base: TBase ... //定义TBase的对象变量
end;


Unit2.pas

TBase1 = class(TBase) //从Unit1的
public
procedure Show;override;
end;

TForm2 = class(TForm1)
procedure Button2Click(Sender: TObject);//这里调用Base的show1
procedure FormCreate(Sender: TObject);//这里创建Base对象,不用inherited
public
property Base: TBase ... //重新用TBase1定义Base对象变量,用它的父类来定义!
end;
然后再分别调用:
form1.base.show;//这里调用的是tbase的show方法;
TBase1(form2.base).show;//这里调用的是tbase1的show方法,你自己再试试,我没有试!
 
晕,有这样用的吗?
 
Unit1.pas

TBase = class
public
abc: string;
procedure Show1;
end;

TForm1 = class(TForm)
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
BaseObj: TBaseObj;
public
property Base: TBase read BaseObj write BaseObj;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Base := TBase.Create;
end;

Unit2.pas

TBase1 = class(TBase)
public
procedure Show2;
end;

TForm2 = class(TForm1)
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
BaseObj: TBase1;
public
property Base: TBase1 read BaseObj write BaseObj;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
Base := TBase1.Create;
end;
 
本来TBase1就是继承自TBase的,可以不在TForm2中重新定义Base,而需要调用TBase1的
方法时用强制类型转换,我只是觉得麻烦,不知道大家有什么好的方法没有?
 
to weiwei81123:
这种方式不行,各是各的对象,不是一个东西。
 
这样不知道行不行
TForm1 = class(TForm)
procedure Button1Click(Sender: TObject);//这里调用Base的show1
procedure FormCreate(Sender: TObject);//这里创建Base对象
function getbase:Tbase
//---重载这两个方法
procedure setbase(base:Tbase) //---重载这两个方法
public
property Base: TBase read getbase write setbase ... //定义TBase的对象变量
end;
 
新课题————————
学习—————————
 

既然 已经 TBase1 = class(TBase)
那么 就 没有 重载这个Base属性 的必要了,
正如 你所说的 类型转换一下 或者 直接赋值 就行了。
 
我认为这里不存在重载属性的问题(重载属性我还没看到哪里的源蚂有写[:D] )

这里问题的重点是关于 这个属性返回的对象(TBase)的设计,创建的是TBase 祖先类那相应的操作就是祖先的,反之,就是他的衍生类
 
这问题可能不简单,建议大家写Demo试试。
我想尽办法都搞不出个所以来,当然也许是我太笨了。[:(]
 
var
form1 : TForm1;
form2 : TForm2;
---------------------
form1.base //Tbase类型
form2.base //TBase1类型,但看不见Tbase类型的属性,你可以将该属性强制转换成Tbase类型,因为TBase1是TBase的子类。

》》问,如何重载这个Base属性,让它原来在TForm1下的所被调用的命令仍然有效,同时又可以在TForm2中使用TBase1的命令。
看不懂,Tform1怎么能访问Tform2的属性和方法呢?
 
我的问题意思是,TForm1已经调用了Base的东东,在继承于它的TForm2中保持有效,同时,
TBase1又继承于TBase,多了些东东,给TForm2用。。。。
 
TForm1 = class(TForm)
procedure Button1Click(Sender: TObject);//这里调用Base的show
procedure FormCreate(Sender: TObject)
// [blue]Base := TBase.Create;[/blue]
public
function GetBase: TBase
virtual;
procedure SetBase(Base: TBase)
virtual;
private
property Base: TBase ... 放到私有部分
end;

TForm2 = class(TForm1)
procedure Button2Click(Sender: TObject);//这里调用Base的show1
procedure FormCreate(Sender: TObject)
// [red]Base := TBase1.Create;[/red]
public
function GetBase: TBase
override;
procedure SetBase(Base: TBase)
override;
end;

用多态来实现,借鉴了工厂方法模式的思想。
虽然定义的时候 GetBase 是返回一个 TBase 类型的对象,但实际上可以把这个决定
延迟到具体的宿主类,返回 TBase 或者 TBase1 均可。

 
我举一个例子,你的问题原理同此:
TBaseForm=class(TForm);
TForm1=Class(TBaseForm);
TForm2=class(TBaseForm);

TBaseFormFactory=class
private
fFormClass:TFormClass;
protected
property FormClass:TFormClass read fFormClass write fFormClass ;
procedure Init;virtual;
end


procedure TBaseFormFactory.Init;
begin
formClass:=TBaseForm

end

TForm1Factory=class(TBaseFormFactory)
procedure init;override;
end;
procedure TForm1Factory.init;
Begin
FormClass:=TForm1;
end;

TForm2Factory=class(TBaseFormFactory)
procedure init;override;
end;
procedure TForm2Factory.init;
Begin
FormClass:=TForm2;
end;

 
只要设置这个属性的方法或者函数是虚拟函数就可以重载,否则不可能。
其实DELPHI的属性就是C++理的setvalue getvalue const什么的, 没有
什么特殊/
 
我想学习
 
TO:delphilai

TBaseFormFactory=class
private
fFormClass:TFormClass;
^--------这是个什么类,在那里定义的?不明白
protected
property FormClass:TFormClass read fFormClass write fFormClass ;
procedure Init;virtual;
end

---------
-------

TForm1Factory=class(TBaseFormFactory)
procedure init;override;
end;
procedure TForm1Factory.init;
Begin
FormClass:=TForm1;
^-----这又是个什么东西,在那里定义的。不懂。
end;


 
FormClass = class of TForm;

在今天问问题真是不合适,平安夜。。。。。。[:(]
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
609
import
I
I
回复
0
查看
626
import
I
顶部