有关操作符as 的用法(50分)

  • 主题发起人 主题发起人 fan_dph
  • 开始时间 开始时间
F

fan_dph

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大侠:
操作符as是将子类对象转化为父类类型的实例;
如:TA = class
A:integer;
end;
TB = class(TA)
B:integer;
end;
var
A:TA;
B:TB;
(B as TA).A:=100;//ok
(A as TB).B:= 100;
//No
但是:为是么在下面程序中可以?
因为sender 是tobject 的对象;tobject 是Tbutton 的祖先类;
procedure button1.onclick(sender:Tobject);
begin
(sender as TButton).caption:='aaa';
end;
 
传入参数 Sender 表明了调用者的身份—— 一个 TObject。
一般情况下,这个调用者就是 Button1,所以上面的代码才不会出错。
原理:
procedure button1onclick(sender:Tobject);
begin
...
end;

button1onclick(Button1);
//将button1作为一个TObject传给 button1onclick 过程。
 
所有的控件都是TOBject,在BUTTON中的ONCLICK它传的是TBUTTON,
如果你换成其它的,保证错
 
procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(sender.ClassName);
end;
sender是BUTTON,明白了?
 
这不就是多态实现吗?
 
问题的关键在于:
sender本身引用的是一个TButton的对象。
object as class 实际上是returns a reference to the same object as object, but with the type given by class. At runtime, object must be an instance of the class denoted by class or one of its descendants, or be nil;
otherwise an exception is raised.
 
如:TA = class
A:integer;
end;
TB = class(TA)
B:integer;
end;
var
A:TA;
B:TB;
begin
a:=TB.Create;
B:=TB.Create;//那么下面两句都ok了。
(B as TA).A:=100;//ok
(A as TB).B:= 100;
//No
 
这个小小的as运算符你要明白了就彻底知道什么是多态了,其实也不难,建议你看看《delphi4编程技术内幕》。www.delphifans.com有电子版下载。你看看吧。我在这里就不说了,因为不是一句两句就能说明白的话题。
 
看了,你们的回答,我对as又有了新的认识,谢谢大家,我是一个编程新手,以后还在大家多多照顾!
 
只有当对象本来就是这个类或其子类的时候才能as成这个类,与对象的声明类型无关。
 
var
A:TA;
//父类对象
B:TB;
//子类对象
A := B;
//Yes 子类对象继承了所有父类方法,属性
B := A;
//No 父类不一定具备子类所有的方法,属性
TObject是所有对象的的父类,所以
var
A: TObject;
B: TButton;
A := B;
//成立
as运算符实际上是这样
比如: Sender as TButton
实际上如下面的函数:
funtion OAsO(sender: TObject): TButton;
begin
if Sender is TButton then

Result := TButton(Sender)
else
//引发一个类型转换异常
end;

 
看看面向对象的书吧。
 
都不想说什么了.
 
后退
顶部