覆盖时是否必须调用基本实现?

时间:2014-07-30 07:57:01

标签: c# inheritance override

由于某些原因,今天早上我看了那个代码(wpf)并且感到困惑

protected override void OnMouseEnter(MouseEventArgs e)
{
    base.OnMouseEnter(e);
}

通常,我只是用我的代码替换base来电。

base通常是否重要?例如,在覆盖OnRender时,我不会这样做,这是不是很糟糕?如果它是我的班级,那么我显然知道何时打电话以及何时不打电话。

4 个答案:

答案 0 :(得分:3)

这取决于基类方法在做什么。例如,在winforms中,如果您覆盖OnLoad方法但忘记拨打base.OnLoad(e),则Form.Load事件将永远不会触发,因为base.OnLoad(e)是触发事件的方法。

如此简短的回答将取决于

答案 1 :(得分:2)

大多数情况下,最好调用基类,但是,如上所述取决于它。

实际上取决于:

  • 如果重写的方法执行了额外的操作,那么您应该在代码之前或之后调用父级。
  • 如果重写的方法执行了不同的操作,则不应该调用父级。

在你的情况下,它可能还有其他一些东西,因为你不知道基本方法究竟做了什么,可能比你想象的更多,你想要添加'你自己的功能。

编辑:(与Sriram Sakthivel的评论):由于Liskov替换原则,在重写方法中做一些不同的事情并不是一个好主意。我的评论:非常正确,但有时你甚至不知道基类的代码,或者你想要做一些不同的事情尽管有这些知识(你可能会在你故意这样做的代码中添加注释)。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

除此之外,没有办法在这里给出明确的通用答案:

  

除非你有充分的理由不这样做,否则你应该在覆盖时调用基本方法。

现在,你怎么知道你有充分的理由不去?那么,您需要知道基本方法的作用,是否需要它,是否可以安全地放弃呼叫等。

换句话说,广义答案是不可能的,这一切都归结为特定情况。