重写时是否强制调用基实现

本文关键字:调用 实现 是否 重写 | 更新日期: 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替代原则,在重写的方法中做一些不同的事情不是一个好主意。我的评论:非常正确,但有时你甚至不知道基类的代码,或者你想做一些不同的事情,尽管有这些知识(你可以在代码中添加一个注释,你故意这样做)。

是否需要调用基函数没有简单的答案。这取决于你是想替换基函数还是补充它。如果您不知道基函数的作用,那么在添加补充代码之前先调用基函数可能是您最好的选择。

没有办法给出一个明确的广义的答案,除了这个:

除非有很好的理由不这样做,否则在重写时应该始终调用基方法。

现在,你怎么知道你是否有一个很好的理由不去呢?嗯,你需要知道基方法是做什么的,你是否需要它,放弃调用是否安全,等等。

换句话说,一个广义的答案是不可能的,这一切都取决于具体情况。