Probem:父抽象类必须知道他现有的所有子类。父类还必须能够通过方法列出其子类的所有类名。
上下文:在我的情况下,父类用于表示Web表单的任何输入数据类型(例如电子邮件,文本,布尔值,整数,图像等)。子类表示每种特定的数据类型。所以有一个布尔类,一个Image类,一个Integer类等等。
我使用的语言是C#。
你会怎么做?
编辑:我需要知道子类的原因是因为我需要知道所有可用的输入数据类型才能列出它们。此外,我需要访问每种数据类型(子类)的方法来获取其属性。
因此,例如,我需要使用存储在数据库中的字符串“Image”来获取Image类的实例。如果基类知道它的所有子节点,我将能够让它给我一个由字符串“Image”表示的子节点,它将返回一个Image类的实例。
我想通过让每个孩子成为一个Singleton并将自己添加到一个子列表(在构造中)来实现它,这个子列表将是基础DataType类的私有字段。
答案 0 :(得分:2)
您可以查看this帖子。看起来你需要遍历已知类型,并使用Type.IsSubclassOf
答案 1 :(得分:2)
您可以在构造函数代码中编写,该代码将通知某些静态类创建了一些新内容。
类似的东西:
class A {
A() {
myBuilder.notifyMe(this);
}
}
myBuilder是一个带有代码的静态类:
void notifyMe(Object o) {
// do whatever you want here
// maybe something like
someList.Add(typeof(o).Name)
}
编辑: 好的,当然,这个解决方案要求首先实例化子类。 如果你想在程序启动时知道所有子类,我认为唯一的方法是扫描整个类路径并检查每个类是否是想要的类的子类。
答案 2 :(得分:2)
让父母意识到自己的孩子是一种强烈的代码味道。它引入了一种讨厌的循环依赖。它依赖于依赖性倒置原则(依赖于抽象,而不是具体结构)尽可能明显(使抽象类实际上依赖于它自身的具体实现)。它消除了作为继承核心的关注点的分离。
简而言之,您应该进行重新设计。我需要了解更多问题背景,以便就此提出具体建议。
答案 3 :(得分:0)
很抱歉要复活这个,但我认为你所寻找的是一个知道所有实现的工厂,而不是一个知道它所有孩子的基类。工厂基本上会知道它可以根据字符串构建的所有类型。
请原谅我,因为我不再熟悉C#语法了,但它会像下面这样:
public class Control // (could be base class or whatever is needed)
{
}
public class ImageControl extends Control
{
}
public class ControlFactory
{
public static Control createControl(String control)
{
if(control == "IMAGE")
{
return new ImageControl();
}
// error situation, control was unknown.
}
}
像其他人评论的那样,父母知道自己的孩子通常是一个非常糟糕的主意。