C#-在抽象超类中生成相同类型的新具体类

时间:2018-08-21 11:47:44

标签: c# .net

我有一个抽象基类,例如有两个子类。在抽象类中,我在“真实世界”中使用模板模式,但对于本示例,我有一个生成器方法,该方法返回类型为 AbstractBaseClass 。现在,我希望实例在运行时成为具体类型。这对于模板模式很重要,因为我在每个子类中使用不同的实现和挂钩。

目前,我想出了以下伪代码。我检查 这是 的具体类,然后调用任一子类的构造函数并返回新的Instance。

%%j

到目前为止,一切都很好。但是现在我希望我的代码对于扩展名是 开放,而对于修改而言是封闭的 。我希望能够添加任意数量的子类,但不必更改generator方法。如何实现?

因此,它在运行时决定要创建哪个实例。 请记住,我没有空的构造函数。但是在每种情况下,都有一个具有相同签名的构造函数。

我找到了这篇文章。似乎朝这个方向发展,但并没有真正帮助我:

谢谢!

2 个答案:

答案 0 :(得分:1)

您应该使用Factory Pattern here

  

定义用于创建对象的接口,但让子类决定   实例化哪个类。 Factory方法允许类延迟   用于子类的实例化。

例如,尽管不完全符合Factory模式,但请查看以下代码段:

public abstract class A
{
 // Some abstract stuff

 public static A CreateInstance(Type myType)
 {
   Type type = myType; // pseudo method
   return (A)Activator.CreateInstance(type);  
 }
}

您可以使用一种方法初始化所有子类。

我建议您深入研究Abstract Factory Design Pattern In C# ,以便更好地学习和理解该概念。

编辑:


或如评论所建议,可以提供更好的通用解决方案:

public abstract class A
{
  // Some abstract stuff

  public static A CreateInstance<T>() where T : A, new() => new T();
}

答案 1 :(得分:1)

尝试:

public AbstractBaseClass GenerateClass()
{

    return (AbstractBaseClass) Activator.CreateInstance(this.GetType(), StringParametter1,StringParametter2);
}

祝你好运!