我正在尝试创建类似工厂模式的通用机制。
工厂将如下:
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的后代可能隐藏无参数构造函数,这将导致工厂失败。
答案 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 */ }