首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >代码契约:抽象类中的不变量

代码契约:抽象类中的不变量
EN

Stack Overflow用户
提问于 2015-03-18 13:41:45
回答 1查看 598关注 0票数 9

我在代码契约中使用不变量时遇到了一个问题。我想在我的抽象类中定义一个不变的,但是它被忽略了。下面的代码显示了我的接口和抽象类。

代码语言:javascript
运行
复制
[ContractClass(typeof(IPointContract))]
interface IPoint
{
    int X { get; }
    int Y { get; }
}

[ContractClassFor(typeof(IPoint))]
abstract class IPointContract : IPoint
{

    public int X
    {
        get { return 0; }

    }

    public int Y
    {
        get { return 0; }
    }

    [ContractInvariantMethod]
    private void PointInvariant()
    {
        Contract.Invariant(X > Y);
    }
}

之后,我在Point类中实现了这个接口,并从它创建了一个对象。这至少应该在运行时失败。

代码语言:javascript
运行
复制
class Point : IPoint
{
    public Point(int X, int Y)
    {
        this._x = X;
        this._y = Y;
    }

    private int _x;
    public int X
    {
        get { return _x; }
    }

    private int _y;
    public int Y
    {
        get { return _y; }
    }
}

class Program
{
    static void Main(string[] args)
    {
        Point p = new Point(1, 2);
    }
}

当我将不变量移到点类时,它工作得很好。所有其他的前或后条件也很好。

在抽象类中不可能有不变量,还是我做错了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-20 12:47:41

接口不支持不变量。(您的问题标题是“抽象类中的不变量”,但问题的关键在于接口。)

我猜这是因为不变量需要状态,但是接口没有状态。我确信代码契约团队能够解决这个问题,我希望他们能够这样做,因为这将是一个很好的特性。

要解决这一限制,您可以:

  • 将不变方法添加到派生类(class Point等)中。
  • 或者,将setter添加到抽象类属性中,并在setter中实现契约逻辑。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29123695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档