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