2011-12-26 58 views
8

我想创建一个通用的工厂模式的机制。我可以强迫后代拥有无参数的构造函数吗?

工厂将是这样的:

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

给它新的()的约束,所以你可以只使用构造,新的操作类型()。但在插件场景中不一定有用。 – 2011-12-26 17:43:52

+1

当你说“空构造函数”时,你的意思是一个不带参数的构造函数吗? – Gabe 2011-12-26 18:04:43

+0

是@加贝。确切地说, – Odys 2011-12-26 18:19:42

回答

8

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

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

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

Using Constructors MSDN上:

在派生类中,如果明确使用基本关键字基类的构造函数不叫,那么默认的构造函数,如果有的话,被隐式调用。

9

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

+0

'new()'泛型类型约束仅仅意味着必须有一个公共无参数构造函数。它不会阻止具有参数的构造函数存在于约束类型(或派生类型)中。 – Oded 2011-12-26 17:38:10

+2

我知道'new()'做了什么,但我不确定OP试图实现什么。看起来他想确保'Activator.CreateInstance ()'不会失败,因为没有无参数的构造函数。将约束添加到'ActionType'将会照顾到这一点。只要没有参数,它也不会阻止添加带参数的构造函数。 – MagnatLU 2011-12-26 17:40:58

+0

(续)因此,可能存在从IAction实现的没有默认构造函数的类型实现,但在尝试将其用作“APlugin”中的泛型类型“ActionType”时会出现编译器错误。 – MagnatLU 2011-12-26 17:42:57

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 */ } 
相关问题