如何强制接口的所有派生类具有带有签名的构造函数?这不起作用:
public interface Constructor<T> where T : Constructor<T>, new()
{
Constructor(T);
}
public interface IParameters
{
}
public interface IRule : Constructor<IParameters>
{
//IRule (IParameters); must exist
}
答案 0 :(得分:1)
您不能强制使用特定的构造函数签名。
即使使用Mark的答案中演示的抽象类,您也只能强制抽象类的构造函数,但是没有什么可以阻止派生类的作者执行以下操作:
public class Rule : MustInitialize<IParameters>, IRule
{
public Rule()
: base (new Parameters())
{
// Assuming Parameters is a class that implements the IParameters interface
}
}
但是,您可以使用method (setter) injection来强制进行依赖项注入:
public interface IMethodInjection<T>
{
void Method(T injected);
}
答案 1 :(得分:0)
不能,不能通过界面。但是您可以通过抽象类来解决它。与接受的答案here相似,请尝试:
public abstract class MustInitialize<T>
{
public MustInitialize(T parameters)
{
}
}
public class Rule : MustInitialize<IParameters>, IRule
{
IParameters _parameters;
public Rule(IParameters parameters)
: base (parameters)
{
_parameters= parameters;
}
}
答案 2 :(得分:0)
我认为您可以像以下示例一样设计基类:
public abstract class MyBase
{
private MyBase()
{
}
public MyBase(string a)
{
}
}
public class MyDerived : MyBase
{
public MyDerived(string a) : base(a)
{
}
}
您甚至可以删除不需要的私有构造函数