为什么不能Override了TPanel的Destory方法?(极度郁闷中……)(100分)

B

Beast

Unregistered / Unconfirmed
GUEST, unregistred user!
我从TPanel继承了一个类,发现想override它的Destory的时候出问题
了,说Base Calss里面没有Destory方法!!郁闷到了极点,看看下面
的代码
unit uTest;
interface
Uses
………………
Type
TAPanel=Class(TPanel)
public
constructor Create(AOwner: TComponent); override;
Destructor Destory();//*******注意这里,不能有“override;”郁闷!!!
end;
implementation
{ TAPanel }
constructor TAPanel.Create(AOwner: TComponent);
begin
inherited;
end;
destructor TAPanel.Destory;
begin
inherited;
end;
end.
 
原代码中TPanel已经继承了TCustcomControl的Destory方法,所以根本不需要,
编译器没错!呵呵
 
楼上仁兄的观点我认为不对!
1、可是我的组件在析构的时候却是需要做一些事情,所以我需要override这个Destory方法呀。
如果我不写override这个关键字是能编译通过的,那这样TCustomControl的Destory还会不
会被执行呢?
TCustomControl的Destory释放了自己的Canvas,如果我的Destory没有没有调用TcustomControl
的Destory方法,那么是不是我的组件的Canvas就没有被释放了呢?
2、那么TPanel也继承了其父类的Create了,为什么Create就可以被Override呢?
 
有没有搞错!难道我非要和你说TPanel是继承TCustomPanel,而TCustomPanel是继承TCustomControl
这样的父子关系后你才知道TCustomPanel中没有Destructor Destory方法所以才报错的嘛!
如果,你写VCL组件的时候真要释放就在finalization中写!
FreeAndNil()用这个方法释放啊!
 
Rockjie:你的脾气好大呀:P
>有没有搞错!难道我非要和你说TPanel是继承TCustomPanel,而TCustomPanel是继承TCustomControl
>这样的父子关系后你才知道TCustomPanel中没有Destructor Destory方法所以才报错的嘛!
>如果,你写VCL组件的时候真要释放就在finalization中写!
>FreeAndNil()用这个方法释放啊!
首先,我当然知道他们的继承关系;
问题是:
TPanel并没有override什么Create方法,但是TPanel的子类可以override一个Create方法,
为什么Tpanel没有override一个Destory方法,Tpanel的子类就不可以override一个Destory呢?
和TPanel的父类是什么有关系吗?
 
问题终于解决了:
大家注意看下面的引用
constructor Create(AOwner: TComponent); override;
Destructor Destory();//*******注意这里,不能有“override;”郁闷!!!
^^^^^^^^^
这里应该是Destroy
就因为这样一个拼写错误!!!郁闷死我了!!
同时也证明楼上RockJie的思路是错误的,我觉得你还是对VCL的机制没有搞清除,要不
就是没看清我的问题。
 
不加override 也可调用到TCustomControl 的destroy();也不须inherited;
我在cpu窗口跟踪到的结果。

 
如果不加override的话,我自己的Destory方法将不会被执行,不信试试:(
 
哈,我对VCL的机制没有搞清除?!随便你怎么说拉,不过我真的搞不清楚的是
你的总积分是5000多,而专家分只有700多?排名1000....,呵呵
不过我确实没细心考虑一下,因为的心思在做一个类似SDK的工具,
当然也包括VCL,也是一个TPanel继承的,可以在运行的时候放大缩小的,嘿嘿,
因为自己也没写Destory方法,所以就一直以为系统给做掉了。
 
我也很迷糊,不知道写override到底有什么用? 不写这个关键字一样可以inherited;啊!
 
嘿嘿,你这个人挺有意思的,倒是攻击起我来了。
我先解释一下我的分数问题:
1、自己确实水平不怎么样,但是这个问题确实比你认识的清除(这一点事实胜于雄辩);
2、5000多是因为我来的早,900多的专家分是因为前2年时间很少来。

也许你真的自以为你对VCL很精通了,但是事实证明这个问题你还是没有搞清楚:(
建议你先摆正心态,来这里是讨论、交流、共同进步的,不是来争胜负、耍大牛的!!!
 
to:一个过客
我在我自己的程序里面试验了一下,发现如果我不写override,那么这个方法是不被执行的,
可以Inherited是指编译的时候不会出错而已。
所以不写override是不能Inherited的。
 
别吵!别吵!都他妈的是大牛!

我骂你一句你就一定要还回来?没劲!
 
啊??
to:一个过客
我更才做了一个很简单的类的继承,发现确实如你所说,不用override
可是我在另外的一个正在开发的类中这样就不被执行了,我也不明白为什么了:(
 
"可以Inherited是指编译的时候不会出错而已"
哈哈哈哈哈,你也不看看中文的是什么意思!是继承标志!说明这个方法是继承来的!
在方法定义的时候加override也说明这个方法是继承来的,这2个关键字是配套使用的!
如果不写Inherited就是表明这个方法的的原先处理过程我不做,我从新写个我自己的处理方式
如果写了就表示原来的方法我也执行,但是在前或在后有我自己的处理方式!你们地,明白?!
还有些形式比如在一个方法中我Inherited paint,就表示我去将系统的paint方法的处理过程引入进来!
还有什么不懂的尽管问!看我知道不!
 
还有,不写override的情况下如果这个方法的名称和父类中的方法名称一样,那么就是表明继承了,
只是系统在编译的时候会给你个Hint:......,OK?!
 
对于不写override的情况:
1、不是hint而是Warning…………:)
2、我发现一个很解释不明白的地方:
我在项目中的一个子类如果不写override的话,就会忽略自己的代码而仅仅执行父类的
代码;
我单独写了一个只有一个方法的类,发现和上面Rockjie说的一样,这是为什么呢?
我真的不懂,Rockjie,解释解释吧。
 
很简单的问题。
如果你不写override的话, 编译器认为你定义了一个新方法, 名为Destroy; 它隐藏了父类的destroy方法。
所以除非你显式调用YourClass.Destroy, 否则释放时调用的都是TObject.Destroy.
如果有override, 那么可以认为TObject.Destroy已经被替换成你的Destroy了(父类的destroy方法只能在子类中用Inherited才能调用, 外界已经无法访问)。
以上是一个通俗的解释, 如果要深究, 那么可以写一篇很长的文章了(似乎没这个必要)。
 
有高手Another_eYes的解说我就不补充了:D
 
顶部