关于子类继承的方法的可见性。清高手指点。(50分)

  • 主题发起人 主题发起人 dcba
  • 开始时间 开始时间
D

dcba

Unregistered / Unconfirmed
GUEST, unregistred user!
假设有如下定义:
unit unit1;
interface
TParent=class(TObject)
public
procedure p1;
procedure p2;
end;

TSon=class(TParent)
end;
implementation
end.

unit unit2;
interface
uses
unit1;
var
s:TSon;

很显然,TSon继承了TParent的两个方法。
则在程序里可以写如下代码:
s.p1;
但是,有没有什么办法能隐藏父类的p1,p2方法呢?
使p1,p2的可见性变为private 或protected
即在unit2里
写上s.以后,系统不会提示任何方法,及在Tson以后,p1,p2对外界全不可见
 
你不是已经知道答案了吗:
TParent=class(TObject)
private
procedure p1;
procedure p2;
end;
就可以了啊

 
你没明白我的意思。
虽然你这样是可以使TSon对外界来说不再有p1,p2方法,但是,我不仅要用TSon还要用TParent
var
p:TParent
那p不就也是什么方法也没有了么?,我要求是对外界Tparent仍然具有p1,p2方法
 
这样做的意义在哪里呢?? 好玩..关注一下..[:D]
 
把p1,p2 在tparent定义成 virtual 的怎么样。
在tson中p1,p2 override它们,把它们的访问控制改成private.
TSon=class(TParent)
private
procedure p1;override;
procedure p2:override;
end;
implementation
procedure tson.p1;
begin
inherited;
end;
procedure tson.p2;
begin
inherited;
end;
 
首先,是不行的,其次这种做法是没有意义的。
类私有方法是为了不让外部访问才定的。
按你的想法,不让s访问p1方法。
但按照DELPHI类体系,子类可以赋值给父类变量,即可以当成父类,用(s as TParent).p1就行了。
所以你的想法是根本上违背了DELPHI的类体系结构的。
从通俗点说吧,
如TSon重新定义p1为私有,则在外部不可见。但s作为TSon找不到p1,
自然会在TParent那里找,就肯定找得到的,如果不是这样自动找上去的话,
Free这个TObject的过程岂不是每个继承类都要实现了?
 
说得好。有道理。那就给分了。
 
后退
顶部