gpt4 book ai didi

c# - 代码契约(Contract) : Invariants in abstract class

转载 作者:太空狗 更新时间:2023-10-29 17:58:06 25 4
gpt4 key购买 nike

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

[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 类中实现了这个接口(interface),并从中创建了一个对象。这至少应该在运行时失败。

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);
}
}

当我将不变量移至点类时,它工作正常。所有其他前置或后置条件也工作正常。

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

最佳答案

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

我的猜测是,这是因为不变量需要状态,而接口(interface)没有状态。我确信代码契约(Contract)团队可以解决这个问题,我希望他们能这样做,因为这将是一个很棒的功能。

要解决此限制,您可以:

  • 将不变方法添加到派生类(class Point 等)。
  • 或者,向抽象类属性添加 setter,并在 setter 中实现合约逻辑。

关于c# - 代码契约(Contract) : Invariants in abstract class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29123695/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com