我有一个抽象类,其构造函数需要一个参数。参数不能为空。
// 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如何绕过所需的参数限制?
答案 0 :(得分:3)
我查看代码合约已经有一段时间了,但我期待您的合同类从未实际实例化过。相反,合同检查器基本上会将合同类中的代码吸收到每个具体的子类中。
所以如果我正在写,AbstractClassContract
中的构造函数应该没问题。或者您可以使用new SqlConnection("this is never called")
更清楚:)