如何为具有所需构造函数参数的类创建契约类

本文关键字:参数 创建 契约 构造函数 | 更新日期: 2023-09-27 18:10:36

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

// 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如何绕过所需的参数限制?

如何为具有所需构造函数参数的类创建契约类

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

所以如果我写,你的构造函数在AbstractClassContract应该是好的。或者您可以直接使用new SqlConnection("this is never called")来更清楚:)