我可以强制后代拥有无参数构造函数吗?

时间:2011-12-26 17:32:06

标签: c# generics inheritance

我正在尝试创建类似工厂模式的通用机制。

工厂将如下:

public class APlugin<ActionType> where ActionType : IAction
{
    // create a new action. Note: ActionType should contain
    // an empty constructor
    public ActionType CreateAction()
    {
        return Activator.CreateInstance<ActionType>();
    }
}

IAction的后代可能隐藏无参数构造函数,这将导致工厂失败。

3 个答案:

答案 0 :(得分:10)

通过提供通用约束where T : new(),可以确保类具有不带参数的构造函数。但它只会影响T类型。包含类将不受影响,因此您可以确保您的案例中的ActionType具有所述构造函数,但您无法在继承自APlugin<T>的任何类上强制执行它。

答案 1 :(得分:8)

您不能在派生类型上强制使用空构造函数或任何类型的构造函数。

构造函数不会被继承,但会被调用。

如果没有链接到基础构造函数(使用: base()语法),将隐式调用默认的基础构造函数。

来自MSDN上的Using Constructors

  

在派生类中,如果未使用base关键字显式调用基类构造函数,则默认构造函数(如果有)将被隐式调用。

答案 2 :(得分:0)

很晚但我认为这值得了解。

您可以在非抽象类上强制使用0参数的构造函数。这是一种类型约束,只要您想在类结构上强制执行这些约束,就可以使用它。它要求您指定实现可能令人不安的接口的类型。如果你想要一些整洁的安全性,这就是价格。

public interface IEmptyConstructor<TThis> where TThis : IEmptyConstructor<TThis>, new() {}

例如单身结构

public abstract class Singleton<TThis> : ISingleton where TThis : Singleton<TThis>, new() { /* some singleton madness */ }