强制派生类具有带有签名的构造函数

时间:2019-07-14 19:52:49

标签: c#

如何强制接口的所有派生类具有带有签名的构造函数?这不起作用:

public interface Constructor<T> where T : Constructor<T>, new()
{
    Constructor(T);
}

public interface IParameters
{
}

public interface IRule : Constructor<IParameters>
{
    //IRule (IParameters); must exist
}

3 个答案:

答案 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)
    {
    }
}

您甚至可以删除不需要的私有构造函数