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

Ody*_*dys 10 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>();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Mag*_*tLU 11

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

  • 我知道`new()`的作用,但我不确定OP正在尝试实现什么.看来他想确保`Activator.CreateInstance <ActionType>()`不会失败,因为没有无参数构造函数.向`ActionType`添加约束将解决这个问题.只要还有无参数的参数,它就不会阻止添加带参数的构造函数. (2认同)

Ode*_*ded 8

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

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

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

使用构造 MSDN上:

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