关于面向对向的问题 ( 积分: 0 )

  • 主题发起人 xblzcqftt
  • 开始时间
X

xblzcqftt

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大哥本人刚开始学DELPHI很多面向对象的问题实在是搞不懂:
TParent = class (TObject)
public
Procedure Hello();virtual;
end;

TChildren = class(TObject)
public
Procedure Hello();override;
Procedure SayGoodBye();
end;

Parent:TParent;
Children:TChildren;
Children:= TChildren.create;
Parent:=Children;
为什么通过Parent 不能访问Children的SayGoodBye() 而(Parent as TChildren)之后就可以访问SayGoodBye()了呢?
实在是对类及对象在内存中的情况不清楚,很混乱!!
各位大哥谢了:)
 
H

hs-kill

Unregistered / Unconfirmed
GUEST, unregistred user!
.........你这么用......根本就是错误的
现在访问不出错还真是幸运
正常的测试应该这样:
TParent = class (TObject)
public
Procedure Hello();virtual;
end;

TChildren = class(TParent)
public
Procedure Hello();override;
Procedure SayGoodBye();
end;

Parent:TParent;
Children:TChildren;
Children:= TChildren.create;
Parent:=Children;
另外parent作为children的父类,自然是不可能知道其子类的方法名的
你用(Parent as TChildren)是把parent强制转化为Tchildren类型去访问,自然能够访问Tchildren类型的方法
这样转化后子类的实例里父类方法的地址都是在前面不变的,所以能够正常访问父类方法
啊 对了 还有一点,你不用执行Parent:=Children;就可以直接(Parent as TChildren)来调用SayGoodBye
 
D

duhai_lee

Unregistered / Unconfirmed
GUEST, unregistred user!
(Parent as TChildren) 是强制转换。 和TChildren(Parent) 是一个效果。
面向对象的原则里有一条是: liskov替换原则, 意思是子类型可以替换父类型,
parent.SayGoodBye不能使用的原因是 父类不能替换子类型。
如:Tform是从Tobject派生下来的, TForm有Showmodal的方法,但是Tobject没有,如果你让一个Tobject类型的实例调用showmodal,必须让它引用一个Tform实例,然后强制类型转换才可以调用。
 
X

xblzcqftt

Unregistered / Unconfirmed
GUEST, unregistred user!
各位老兄非常感谢,嘿嘿,
不过说实话到现在还是不能理解,
不过还是感谢
 

Similar threads

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