问题:类之间的强制类型转换(5分)

E

echoljb

Unregistered / Unconfirmed
GUEST, unregistred user!
(新手,只剩下5分了,55~~)
Tpye
TMainForm = Class(TForm)
end;
而MainForm是TMainForm的一个实例,则TForm(MainForm)是什么意思?返回的对象是和原来
的MainForm有什么不同的地方?在看VCL源码是经常出现这样的代码,不明白,如:

Procedure TApplication.CreateForm(InstanceClass: TComponentClass
Var Reference);
Var
Instance: TComponent;
Begin
Instance := TComponent(InstanceClass.NewInstance);//为什么要用TComponent?InstanceClass.NewInstance
//返回的不就是TComponent对象吗?
TComponent(Reference) := Instance
//TComponent(Ref)对Ref有什么影响?
Try
Instance.Create(Self)
//Instance已经通过NewInstance方法实例化了,什么还要
//Create(self)?
Except
TComponent(Reference) := Nil;
Raise;
End;
If (FMainForm = Nil) And (Instance Is TForm) Then
Begin
TForm(Instance).HandleNeeded;
FMainForm := TForm(Instance)
//FMainForm是继承自TForm的类的一个实例,这个
//语句执行后FMainForm和一般的Form对象还要分别吗?
End;
End;
 
Procedure TApplication.CreateForm(InstanceClass: TComponentClass
Var Reference);
Var
Instance: TComponent;
Begin
Instance := TComponent(InstanceClass.NewInstance);//newinstance 返回tobject类型,须强制转换
TComponent(Reference) := Instance
//为了等号左右类型兼容
Try
Instance.Create(Self)
//NewInstance方法分配空间,create则初始化一些属性等。
Except
TComponent(Reference) := Nil;
Raise;
End;
If (FMainForm = Nil) And (Instance Is TForm) Then
Begin
TForm(Instance).HandleNeeded;
FMainForm := TForm(Instance)
//FMainForm是继承自TForm的类的一个实例,这个
//语句执行后FMainForm和一般的Form对象不分别
End;
End
//你对oop的多态理解的不好。
 
类的兼容是向下的
例如
哺乳动物-》狗-》黑狗
黑狗可以看作是狗也可以看作是哺乳动物
一个类是他祖先类的一个特例
所以TMainForm是TForm当然可以牵制转化成TForm
 
实际上一个实例的类型,在它create的时候已经确定了。已经分配了内存布局。
比如你用B类来强制转换A的时候,它把A类里除B类以外的接口全部隐藏起来,你
只能看到B类的接口。如果B类的某些接口在A类里没有,那么抛出异常,转换不能
成功。这也说明了为什么一般强制转换只能把子类转换成父类。
实际上,A这个类在内存里已经确定了,你用什么来强制转换就相当透过什么
样的眼镜来看它。
 
强制类型转换是指针类型的转换,而对象本身的类型从Create后就不能
变了。
用基类型指针指向派生类对象的转换是安全的,否则不安全.
 
xeen,说得对。
因为不同类的强制转化在调用方法时会调用到在方法表中与自己相对的方法。
而胡乱转换的话调用的方法就不一定是什么了。
所以基类转化到用派生类是相对安全的,因为方法表中的方法位置是正确的,
派生类的方法只能增多。
所以xeen,说得对。
 
wr960204,
可以先用is判断么,这样就不会出错了。
 
接受答案,可惜分太少,谢谢楼上的几位。
//bow
 

Similar threads

回复
0
查看
684
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
663
import
I
顶部 底部