在构造函数中使用Parent to Child会感到困惑

时间:2013-05-20 14:05:42

标签: java inheritance constructor abstraction

我希望我能就这个问题得到一些澄清。所以类层次结构如下所示: AbstractClass,ConcreteClass1和ConcreteClass2。 ConcreteClass1扩展了AbstractClass,ConcreteClass2扩展了ConcreteClass1:

ConcreteClass1中的构造函数如下所示:

private final AbstractClass parent;

public ConcreteClass1( int id, AbstractClass aParent )
{
  super( id );

  parent = aParent;
}

我想知道在什么情况下这可能有用。我没有看到如何实例化ConcreteClass1,除非为aParent参数传递null。在ConcreteClass2中使用类似的构造函数(即它还具有AbstractClass类型的参数)。

这可能是一个合理的设计吗?

2 个答案:

答案 0 :(得分:0)

是的,当您第一次想要获取实例时,您必须通过null,但在以后的时间内,您可以传递以前创建的实例。

这很常见,并且在许多框架和库中使用,例如Qt的QObject就像这样,目的是创建运行时实例的分层树。很明显,这棵树的根不能也不应该有父。

编辑:举一个实际的例子,左边的树是你的类继承树,右边树是运行时对象树的一个例​​子。请注意,该实例可以是AbstractClass的任何子类。

(CC1表示ConcreteClass,CC2表示ConcreteClass2

         AbstractClass                           X (NULL)
               |                                 |
               |                                 |
        ConcreteClass1                        root:CC1
               |                             /        \
               |                            /          \
        ConcreteClass2                 ins2:CC2      ins3:CC1
                                           |          /    \
                                           |         /      \
                                       ins4:CC1   ins5:CC2  ins6:CC2
                                       ...        ...       ...

答案 1 :(得分:0)

它在任何层次结构或继承类型布局中特别有用。

例如,假设鼠标单击GUI元素。假设您的课程有方法

handleClick(int x, int y);

第一次点击可以由底层组件处理,让父级允许结构将点击传递给父级。这类似于向上链接方法/事件。

或者,这也可以由一些外部控制器来完成,该外部控制器管理调用click方法的哪些元素,但它可能比仅使用父模型更复杂,或者只是更不干净(尽管不总是)。

在这种类型的模型中,“父”将为空的唯一时间是当它是顶级元素时,其余部分将使父母更接近顶部。