如何使用所需的构造函数参数为类创建契约类?

时间:2014-06-26 16:01:06

标签: c# .net code-contracts

我有一个抽象类,其构造函数需要一个参数。参数不能为空。

// the abstract class
[ContractClass(typeof(AbstractClassContract))]
public abstract class AbstractClass
{
   // Constructor with required parameter
   protected AbstractClass(SqlConnection connection)
   {
      Contract.Requires(connection != null);
      Connection = connection;
   }

   protected SqlConnection Connection { get; set; }

   public abstract string GetSomething();
}

抽象类有一个合同类,用于检查抽象成员的前/后条件。

// the contract class
[ContractClassFor(typeof(AbstractClass))]
public abstract class AbstractClassContract
{
   public override string GetSomething()
   {
      Contract.Ensures(Contract.Result<string>() != null);
      return default(string);
   }
}

由于错误'AbstractClass'不包含带0参数的构造函数,因此上述代码无法编译。

我可以添加一个构造函数,如下所示,代码将编译,似乎可以工作。

   public AbstractClassContract(SqlConnection connection)
      : base(connection)
   { }

但这是合约类的有效构造函数吗?在某些情况下会引起问题吗?我担心的是,参数最终是抽象类的构造函数所必需的。

如果它有效,那么.NET如何绕过所需的参数限制?

1 个答案:

答案 0 :(得分:3)

我查看代码合约已经有一段时间了,但我期待您的合同类从未实际实例化过。相反,合同检查器基本上会将合同类中的代码吸收到每个具体的子类中。

所以如果我正在写AbstractClassContract中的构造函数应该没问题。或者您可以使用new SqlConnection("this is never called")更清楚:)