这是一个维护虚拟方法调用顺序很重要的场景:
class BaseClass
{
public int Answer { get; protected set; }
protected virtual void VM1() { Answer += 20; }
protected virtual void VM2() { Answer += 10; }
public void Init() { VM1(); VM2(); }
}
class DerivedClass : BaseClass
{
private int _dividend;
protected override void VM1() { Answer = _dividend = 20; }
protected override void VM2() { Answer /= 10 }
}
现在假设你在某个地方有这个:
var baseObj = new BaseClass();
baseObj.Init();
int baseAnswer = baseObj.Answer;
var derivedObj = new DerivedClass();
derivedObj.Init();
int derivedAnswer = derivedObj.Answer;
baseAnswer
将包含30
并将derivedAnswer
包含2
.
现在,假设Init()
被改变了,所以VM2()
之前被调用过VM1()
。baseAnswer
仍然包含30
所以一切看起来都很好。但是,derivedAnswer
将包含20
(它是2
)!这就是我相信这本书警告你的那种情况。