C# 重写时调用基本实现是否是必需的?

C# 重写时调用基本实现是否是必需的?,c#,inheritance,overriding,C#,Inheritance,Overriding,出于某些原因,今天早上我看了看那个代码(wpf),感到困惑 protected override void OnMouseEnter(MouseEventArgs e) { base.OnMouseEnter(e); } 通常,我只是用我的代码替换base调用 base呼叫通常重要吗?例如,当重写OnRender时,我不会这样做,这是不是很糟糕?如果它是我的类,那么我显然可以确定何时调用,何时不调用。这取决于基类方法在做什么。例如,在winforms中,如果覆盖OnLoad方法,而忘记

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

protected override void OnMouseEnter(MouseEventArgs e)
{
    base.OnMouseEnter(e);
}
通常,我只是用我的代码替换
base
调用


base
呼叫通常重要吗?例如,当重写OnRender时,我不会这样做,这是不是很糟糕?如果它是我的类,那么我显然可以确定何时调用,何时不调用。

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


所以简单的答案是它取决于。

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


所以答案很简单,这要看情况而定。

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

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

这里没有办法给出一个明确的通用答案,除非:


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

现在,你怎么知道你有没有理由不这么做?那么,您需要知道基本方法的作用,是否需要它,是否可以安全地放弃调用,等等


换句话说,概括的答案是不可能的,这一切都归结于具体的情况。

这里没有办法给出明确的概括答案,除了以下几点:


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

现在,你怎么知道你有没有理由不这么做?那么,您需要知道基本方法的作用,是否需要它,是否可以安全地放弃调用,等等


换句话说,一个普遍的答案是不可能的,它可以归结为具体的情况。

大多数情况下,最好调用基类,但是,正如上面所说,这取决于具体情况

实际上,这取决于:


  • 如果被重写的方法执行了其他操作,那么您应该在代码之前或之后调用父级

  • 如果重写的方法做了一些不同的事情,那么您不应该调用父对象
在您的情况下,它可能会做一些额外的事情,因为您不知道基本方法到底在做什么,可能比您想象的要多,并且您希望“添加”您自己的功能


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

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

实际上,这取决于:


  • 如果被重写的方法执行了其他操作,那么您应该在代码之前或之后调用父级

  • 如果重写的方法做了一些不同的事情,那么您不应该调用父对象
在您的情况下,它可能会做一些额外的事情,因为您不知道基本方法到底在做什么,可能比您想象的要多,并且您希望“添加”您自己的功能


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

如果这是强制性的,你不认为如果你不这样做,你会得到编译器警告/错误吗?@Damien_the_unsiver,编译器如何知道我是否已经完全实现了它,并且不需要调用
base
?从编译器的角度来看,删除基调用是安全的,但它真的安全吗(wpf方面)?除非您有充分的理由不这样做,否则您应该在重写时调用基方法。@LasseV.Karlsen,这正是我的观点!今天早上我开始想“为什么我要简单地删除base调用?”老实说,我不知道这个坏习惯是从哪里来的。如果它是强制性的,你不认为如果你不这样做,你会得到一个编译器警告/错误吗?@Damien_不信者,编译器怎么知道我是否已经完全实现了它,并且不需要调用
base
?从编译器的角度来看,删除基调用是安全的,但它真的安全吗(wpf方面)?除非您有充分的理由不这样做,否则您应该在重写时调用基方法。@LasseV.Karlsen,这正是我的观点!今天早上我开始想“为什么我要删除基本呼叫?”老实说,我不知道这个坏习惯是从哪里来的。我的情况也是这样吗?如果没有
base
调用,
MouseEnter
事件是否会中断?@Sinatr这是winforms还是wpf?在我的情况下是否相同?如果没有
base
调用,
MouseEnter
事件是否会中断?@Sinatr这是winforms还是wpf?我今天要重构很多代码。谢谢