当您覆盖方法时,不应该更改方法的行为,只需将其专门化即可。因此,您必须在重写方法中调用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? */
}
}
答案 0 :(得分:4)
因此,您必须在重写中调用base.MyVirtualMethod() 方法并添加专业化代码。
情况并非总是如此 - 有些情况下,您不希望在派生类中执行超类正在执行的操作,因此您不希望调用base
。
如果要扩展基本行为,请在base
调用之前或之后放置代码,具体取决于实际问题。没有规则'总是在你的代码之前调用基础'。
答案 1 :(得分:2)
基本调用 不存在。您可以在文档中指定基本调用应该在其他代码之前,在其他代码之后,两者之间,还是两者之间(不存在),以及其他代码的性质应该是什么。这一切都取决于你想要完成的事情。
如果您发现附加代码的最佳位置实际上位于基本调用内部,那么这意味着基本方法应该分成两个或更多方法。
答案 2 :(得分:1)
答案是,与许多问题一样,“这取决于”。
假设您正在扩展将一些数据写入文件的类,并且扩展需要在文件的末尾添加更多数据(SimpleDataFile.writeFile()
由ExtendedDataFile.writeFile()
扩展):在这样的情况下方案,您将在调用基本方法后添加代码。
现在,假设您的扩展程序添加了一个预处理工具,可能会在基本文件输出中添加颜色(SimpleDataFile.writeFile()
FancyDataFile.writeFile()
扩展{}>):在这种情况下,您可以在发送任何内容之前实际操作到文件,你的代码将在基本调用之前结束。
答案 3 :(得分:1)
准确回答您的问题:不要覆盖它:)当您覆盖它时,您将更改行为。 大多数时候,我将新代码置于基本方法调用之下,因为它确实执行了此基本行为,然后执行了一些其他更多行为。然而,这不是一成不变的,而且取决于您的需求。
答案 4 :(得分:1)
我通常首先调用基本方法,以确保已经发生任何必需的初始化,并且我的代码实际上覆盖了基本行为,而不是相反。 显然这取决于具体的情况,但很可能在某些情况下你知道你的代码需要先运行。
答案 5 :(得分:0)
这取决于你想做什么,但两者都可以!