在C#中覆盖方法时,是否应该调用基类实现?(针对ASP.NET)

6

我了解覆盖一个方法/函数会重新定义其在派生类中的实现,使其与基类的实现不同。

现在让我困惑的是,如果我在ASP.NET中覆盖一个类,比如CreateChildControls()(我随便挑了这个例子),VS2008会自动生成:

protected override void CreateChildControls()
{
   base.CreateChildControls();
}

很好, 默认实现只是调用基类的CreateChildControls()方法。

所以如果我想运行一些代码,由于我不知道如何使用base.CreateChildControls(),我应该这样做:

protected override void CreateChildControls()
{
   /*My Code Here*/                    
   base.CreateChildControls();
}

或者,完全忽略base.CreateChildControls()并直接执行
protected override void CreateChildControls()
{
   /*My Code Here*/                    
}
5个回答

11

这取决于你。通常,你想调用基类方法,因为它可能会执行许多你不知道的操作(特别是在你无法控制的类中..懂吗?控制)。但是,如果你非常自信你不需要(或者不想要)基类的“操作”,你可以删除对其的调用。


我真的很惊讶,你居然可以重写一个你没有特权的基类。 - Matt
7
我需要有自由。仅仅因为我是你的孩子,并不意味着我想要做所有和你一样的事情。有时候,我需要走出去,用自己的方式去做事情。如果你强迫我按照你的方式去做,那么你会成为一个过度保护的父母。 :) - JP Alioto
从我在自定义“Control”中覆盖时调用基类开始,关于“OnXxxx”覆盖,通常我会在派生方法的末尾调用base.OnXxxx。是否有什么经验法则可以决定是在派生方法的开头还是结尾调用base.CreateChildControls - superjos
这取决于你的代码是否依赖于base.OnXxxx()方法的影响来进行正常运行。如果你不在意或者不确定,你应该调用它,并在你自己的代码之前调用它,以使基类方法尽可能接近预期状态运行。 - tomfanning

3

这只是一个问题,你是想完全替换行为还是添加行为。

对于像CreateChildControls这样的内容,你可能会保留对基类的调用。


1

这取决于你想做什么。如果你想调用base.CreateChildControls()方法,然后在方法被调用之前或之后执行一些自定义操作,那么你可以这样做。

如果你想完全控制CreateChildControls被调用时发生的事情,那么你可以完全忽略调用它。

默认情况下存在它只是为了给你一点指导。


0
你可能想看看模板方法模式。虽然你无法控制库类的实现方式,但这可能有助于确保你编写的代码易于正确使用。

0

这取决于您想要替换还是完善基本实现...在大多数情况下,您应该调用基本实现(并且在CreateChildItems方法的情况下,您绝对应该这样做...)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接