如何为具有所需构造函数参数的类创建契约类
本文关键字:参数 创建 契约 构造函数 | 更新日期: 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")
来更清楚:)