代码协定:模板方法模式的超类上的不变量不起作用



>假设我有以下代码:

public abstract class TemplateBase {
    public void TemplateMethod() {
        Operation(); }
    protected abstract void Operation(); }
public sealed class Implementation : TemplateBase {
    bool _alwaysTrue;
    public Implementation(bool alwaysTrue) {
        _alwaysTrue = alwaysTrue; }
    [ContractInvariantMethod] void ObjectInvariant() {
        Contract.Invariant(_alwaysTrue == true); }

    protected override void Operation() {
        _alwaysTrue = false; } }
[TestClass] public sealed class InvariantTest {
    [TestMethod] public void Constructor() {
        new Implementation(false); }
    [TestMethod] public void Method() {
        new Implementation(true).TemplateMethod(); } }

InvariantTest.Constructor 总是失败,并出现"Invariantfailed"异常。

如何使不变量测试方法基于不变量失败?

我已将运行时检查设置为完整,甚至启用了"呼叫站点需要检查",但即使这样也无济于事。

如果您使用最新版本 (1.4.50910.0),您将从静态检查器收到一条警告,指出不变性为 false。

但对于运行时,这是预期行为。从手册:

在运行时检查期间,不变量是 在每个公共方法的末尾检查。

出于

对象不变量的目的,受保护的覆盖可能是一个很好的理由被认为是"公共的"。您可能想在代码协定论坛上开始讨论。

相关内容

  • 没有找到相关文章

最新更新