我正在检讨一些代码,今天遇到了一些代码(由这个片段精确地画出)传来的后果......编译花絮:这是什么代码
public abstract class FlargBase{
public FlargBase(){
this.DoSomething();
}
public abstract void DoSomething();
}
public class PurpleFlarg: FlargBase{
public PurpleFlarg()
: base(){
}
public override void DoSomething(){
// Do something here;
}
}
的编译器会发出任何错误或警告,但CodeAnalysis警告呼叫链包含对虚拟方法的调用并可能产生意想不到的结果。
我很好奇,因为正如我所见,有两件事情会发生。
创建基类的一个实例将为方法的调用没有实现定义。我希望编译器出错,或者运行时由于缺少实现而引发异常。我假设编译器提供了{}的实现我错误地输入了原始代码;它确实包含了类中的抽象关键字。- 创建派生类的实例将导致对尚未实际构建的类的方法的调用。我会预料到这会抛出一个异常。
此代码已在生产环境中持续数月。它显然工作正常,没有人注意到任何奇怪的行为。
我希望StackOverflow中令人难以置信的才能可以让我对这段代码的行为和后果有所了解。
我得到一个错误:'“ConsoleApplication1.FlargBase.DoSomething()”是抽象的,但它包含在非抽象类“ConsoleApplication1.FlargBase''。此外,在创建派生类的实例时逐句通过代码显示它在派生类中调用DoSomething()。 – Stijn
这与脆性基类问题密切相关。见http://blogs.msdn.com/b/ericlippert/archive/2004/01/07/virtual-methods-and-brittle-base-classes.aspx – Odrade