从抽象基类构造函数创建继承类的实例

Posted

技术标签:

【中文标题】从抽象基类构造函数创建继承类的实例【英文标题】:Create an instance of an inherited class from abstract base class constructor 【发布时间】:2011-05-27 19:15:37 【问题描述】:

使用反射,是否可以使用抽象基类的构造函数创建从抽象基类继承的类型的实例?也就是说,如果继承类没有自己的构造函数?有点像下面,但它会抛出一个错误,因为你当然不能创建抽象类的实例:

abstract class PersonBase

     string Name;

     public PersonBase(string _name)  Name = _name; 


class Person : PersonBase




public static T GetPerson<T>(string name) where T : PersonBase, new()

   ConstructorInfo info = typeof(T).BaseType.GetConstructor(new Type[] 
                                                               typeof(string) );

   object result = info.Invoke(new object[]  name ); 

   return (T)result;    

你可以通过 new T (assign properties here) 来完成这项工作,但当然那不是构造函数,属性必须是公共的,等等。

【问题讨论】:

通常这被视为Factory method 的主要情况。 【参考方案1】:

唯一合法调用抽象类构造函数的地方——无论是否通过反射——是在派生类的构造函数中。所以不 - 正如您所说,您将创建 abstract 类型的实例,而不是 concrete 类型。想象一下,如果抽象类有一个抽象方法,而你在构造函数返回的任何东西上调用它——那会做什么?

如果您可以向我们提供有关您想要实现的目标的更多信息,我们可能会为您提供更多帮助。

(您当前的示例甚至无法编译,因为默认的 Person 构造函数没有可调用的无参数基类构造函数。)

【讨论】:

我正在创建一个带有只读成员的抽象不可变类型。我希望这个通用的“Get”方法能够使用基本构造函数获取派生自该抽象类型的任何类的实例。由于它是不可变的,因此必须在构造函数中分配该成员。如果可能的话,根本不希望继承类型具有构造函数。但我会走另一条路。 @Sean:除了静态类(不能从object以外的任何东西继承)之外,你不能创建没有构造函数的类型,你不能创建一个抽象类的实例。 你可以有一个只有公共属性的类,然后像这样初始化它:new Foo Property1 = x, Property2 = x 。我猜这个类仍然有一个默认的无参数构造函数。我想我的意思是除了默认之外没有构造函数。无论如何,只读属性不能以这种方式初始化。 @Sean:调用无参数构造函数,或者可能是带有可选参数的构造函数。它仍在调用构造函数。只有无参数的构造函数很好,但该构造函数必须调用基类中的构造函数。目前还不清楚为什么你要这样做。如果您能给我们提供更大的图景,我们可能会提供帮助。 @Sean:您不一定需要发布完整的代码 - 只需让我们深入了解您想要实现的更大图景。

以上是关于从抽象基类构造函数创建继承类的实例的主要内容,如果未能解决你的问题,请参考以下文章

C++中,继承时,创建子类对象,能否在子类构造函数初始化列表里调用基类构造函数?

将参数传递给基类构造函数

定义子类对象时要先调用基类构造函数,是应该哪样理解呢

面向对象:继承抽象类抽象方法虚方法

Typescript派生类和抽象类

构造函数继承问题c