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

C# 强制派生类具有带签名的构造函数,c#,C#,如何强制接口的所有派生类都具有带签名的构造函数?这不起作用: public interface Constructor<T> where T : Constructor<T>, new() { Constructor(T); } public interface IParameters { } public interface IRule : Constructor<IParameters> { //IRule (IParameters);

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

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

public interface IParameters
{
}

public interface IRule : Constructor<IParameters>
{
    //IRule (IParameters); must exist
}
公共接口构造函数,其中T:Constructor,new()
{
建造师(T);
}
公共接口参数
{
}
公共接口IRule:构造函数
{
//IRule(i参数);必须存在
}

您不能,不能通过接口。但是你可以通过一个抽象类来实现它。与公认答案所描述的相似,请尝试:

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;
    }
}
公共抽象类必须初始化
{
公共MustInitialize(T参数)
{
}
}
公共类规则:MustInitialize,IRule
{
i参数_参数;
公共规则(iPareters参数)
:基准(参数)
{
_参数=参数;
}
}

您不能,不能通过接口。但是你可以通过一个抽象类来实现它。与公认答案所描述的相似,请尝试:

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;
    }
}
公共抽象类必须初始化
{
公共MustInitialize(T参数)
{
}
}
公共类规则:MustInitialize,IRule
{
i参数_参数;
公共规则(iPareters参数)
:基准(参数)
{
_参数=参数;
}
}

我认为您可以像下面的示例那样设计基类:

public abstract class MyBase
{
    private MyBase()
    {
    }

    public MyBase(string a)
    {
    }
}

public class MyDerived : MyBase
{
    public MyDerived(string a) : base(a)
    {
    }
}

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

我认为您可以像下面的示例那样设计基类:

public abstract class MyBase
{
    private MyBase()
    {
    }

    public MyBase(string a)
    {
    }
}

public class MyDerived : MyBase
{
    public MyDerived(string a) : base(a)
    {
    }
}

如果不需要私有构造函数,您甚至可以删除它。

您不能强制特定的构造函数签名。
即使使用Mark的答案中所示的抽象类,您也只能强制抽象类的构造函数,但没有什么可以阻止派生类的作者执行以下操作:

public class Rule : MustInitialize<IParameters>, IRule
{
    public Rule()
        : base (new Parameters())
    {
        // Assuming Parameters is a class that implements the IParameters interface
    }
}
公共类规则:MustInitialize,IRule
{
公共规则()
:base(新参数())
{
//假设Parameters是一个实现IPParameters接口的类
}
}
但是,您可以使用以下命令强制依赖项注入:

公共接口IMethodInjection
{
孔隙法(T注入法);
}

您不能强制特定的构造函数签名。
即使使用Mark的答案中所示的抽象类,您也只能强制抽象类的构造函数,但没有什么可以阻止派生类的作者执行以下操作:

public class Rule : MustInitialize<IParameters>, IRule
{
    public Rule()
        : base (new Parameters())
    {
        // Assuming Parameters is a class that implements the IParameters interface
    }
}
公共类规则:MustInitialize,IRule
{
公共规则()
:base(新参数())
{
//假设Parameters是一个实现IPParameters接口的类
}
}
但是,您可以使用以下命令强制依赖项注入:

公共接口IMethodInjection
{
孔隙法(T注入法);
}

您是在询问C#8中的一个特定新功能吗?不仅仅是一般性的。您不能在派生类上强制使用特定的构造函数。构造函数不是继承的,也不能在接口中指定。(我不确定c#8接口的默认实现是什么。)你是在问c#8中的一个特定的新特性吗?不仅仅是一般性的。你不能在派生类上强制使用特定的构造函数。构造函数不是继承的,也不能在接口中指定。(不过,我不确定c#8接口的默认实现。)这仍然不会强制派生类上的构造函数接受参数。
ipParameters
的任何实现都可以在对基构造函数的调用中进行初始化。“有点快了”@ZoharPeled,总比什么都没有好!我开始写评论,但时间太长了。请看我的答案-它准确地解释了我的意思。这仍然不能强制派生类上的构造函数接受参数。
ipParameters
的任何实现都可以在对基构造函数的调用中进行初始化。“有点快了”@ZoharPeled,总比什么都没有好!我开始写评论,但时间太长了。看我的答案——它准确地解释了我的意思。