如何在不更改行为的情况下覆盖虚拟方法?

时间:2011-11-25 11:09:38

标签: c# oop

当您覆盖方法时,不应该更改方法的行为,只需将其专门化即可。因此,您必须在重写方法中调用base.MyVirtualMethod()并添加特化代码。

但我总是想知道何时必须致电base.MyVirtualMethod()。或者从另一个角度来看,我如何编写我的虚拟方法?我是否应该期望用户将其称为被覆盖方法的第一个或最后一个?

public class Parent
{
    public virtual void MyMethod(){ /* Some code*/ }
}
public class Child : Parent
{
    public override void MyMethod()
    {
        /* Does my code goes here? */
        base.MyMethod();
        /* Or does my code goes here? */
    }
}

6 个答案:

答案 0 :(得分:4)

  

因此,您必须在重写中调用base.MyVirtualMethod()   方法并添加专业化代码。

情况并非总是如此 - 有些情况下,您不希望在派生类中执行超类正在执行的操作,因此您不希望调用base

如果要扩展基本行为,请在base调用之前或之后放置代码,具体取决于实际问题。没有规则'总是在你的代码之前调用基础'。

答案 1 :(得分:2)

基本调用 不存在。您可以在文档中指定基本调用应该在其他代码之前,在其他代码之后,两者之间,还是两者之间(不存在),以及其他代码的性质应该是什么。这一切都取决于你想要完成的事情。

如果您发现附加代码的最佳位置实际上位于基本调用内部,那么这意味着基本方法应该分成两个或更多方法。

答案 2 :(得分:1)

答案是,与许多问题一样,“这取决于”。

假设您正在扩展将一些数据写入文件的类,并且扩展需要在文件的末尾添加更多数据(SimpleDataFile.writeFile()ExtendedDataFile.writeFile()扩展):在这样的情况下方案,您将在调用基本方法后添加代码。

现在,假设您的扩展程序添加了一个预处理工具,可能会在基本文件输出中添加颜色(SimpleDataFile.writeFile() FancyDataFile.writeFile()扩展{}>):在这种情况下,您可以在发送任何内容之前实际操作到文件,你的代码将在基本调用之前结束。

答案 3 :(得分:1)

准确回答您的问题:不要覆盖它:)当您覆盖它时,您将更改行为。 大多数时候,我将新代码置于基本方法调用之下,因为它确实执行了此基本行为,然后执行了一些其他更多行为。然而,这不是一成不变的,而且取决于您的需求。

答案 4 :(得分:1)

我通常首先调用基本方法,以确保已经发生任何必需的初始化,并且我的代码实际上覆盖了基本行为,而不是相反。 显然这取决于具体的情况,但很可能在某些情况下你知道你的代码需要先运行。

答案 5 :(得分:0)

这取决于你想做什么,但两者都可以!