重写时是否强制调用基实现
本文关键字:调用 实现 是否 重写 | 更新日期: 2023-09-27 18:15:28
由于某些原因,今天早上我看了一下代码(wpf),感到困惑
protected override void OnMouseEnter(MouseEventArgs e)
{
base.OnMouseEnter(e);
}
通常,我会简单地用我的代码替换base
调用。
base
呼叫一般重要吗?我不这样做的时候,例如,重写OnRender
,它是坏的吗?如果它是我的类,那么我显然知道什么时候调用,什么时候不调用。
这取决于基类方法正在做什么。例如,在winforms中,如果你覆盖OnLoad
方法,你忘记调用base.OnLoad(e)
,那么Form.Load
事件将永远不会触发,因为base.OnLoad(e)
是触发事件的方法。
所以简短的答案是这取决于
大多数情况下,最好调用基类,但是,如上所述,这要视情况而定。
实际上取决于:
- 如果被重写的方法做了一些IN extra的事情,那么你应该在代码之前或之后调用父类。
- 如果被重写的方法做了一些不同的事情,那么你不应该调用父类。
在你的例子中,它可能做了一些额外的事情,因为你不知道基方法到底在做什么,可能比你想象的要多,你想"添加"你自己的功能。
编辑:(与Sriram Sakthivel的评论):由于Liskov替代原则,在重写的方法中做一些不同的事情不是一个好主意。我的评论:非常正确,但有时你甚至不知道基类的代码,或者你想做一些不同的事情,尽管有这些知识(你可以在代码中添加一个注释,你故意这样做)。
是否需要调用基函数没有简单的答案。这取决于你是想替换基函数还是补充它。如果您不知道基函数的作用,那么在添加补充代码之前先调用基函数可能是您最好的选择。
没有办法给出一个明确的广义的答案,除了这个:
除非有很好的理由不这样做,否则在重写时应该始终调用基方法。
现在,你怎么知道你是否有一个很好的理由不去呢?嗯,你需要知道基方法是做什么的,你是否需要它,放弃调用是否安全,等等。
换句话说,一个广义的答案是不可能的,这一切都取决于具体情况。