我有一个抽象基类,例如有两个子类。在抽象类中,我在“真实世界”中使用模板模式,但对于本示例,我有一个生成器方法,该方法返回类型为 AbstractBaseClass 。现在,我希望实例在运行时成为具体类型。这对于模板模式很重要,因为我在每个子类中使用不同的实现和挂钩。
目前,我想出了以下伪代码。我检查 这是 的具体类,然后调用任一子类的构造函数并返回新的Instance。
%%j
到目前为止,一切都很好。但是现在我希望我的代码对于扩展名是 开放,而对于修改而言是封闭的 。我希望能够添加任意数量的子类,但不必更改generator方法。如何实现?
因此,它在运行时决定要创建哪个实例。 请记住,我没有空的构造函数。但是在每种情况下,都有一个具有相同签名的构造函数。
我找到了这篇文章。似乎朝这个方向发展,但并没有真正帮助我:
谢谢!
答案 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);
}
祝你好运!