2

我希望我能就这个问题得到一些澄清。所以类层次结构看起来像这样:AbstractClass、ConcreteClass1 和 ConcreteClass2。ConcreteClass1 扩展 AbstractClass 和 ConcreteClass2 扩展 ConcreteClass1:

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

private final AbstractClass parent;

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

  parent = aParent;
}

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

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

4

2 回答 2

0

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

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

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

(CC1 表示ConcreteClass,CC2 表示ConcreteClass2

         AbstractClass                           X (NULL)
               |                                 |
               |                                 |
        ConcreteClass1                        root:CC1
               |                             /        \
               |                            /          \
        ConcreteClass2                 ins2:CC2      ins3:CC1
                                           |          /    \
                                           |         /      \
                                       ins4:CC1   ins5:CC2  ins6:CC2
                                       ...        ...       ...
于 2013-05-20T14:15:45.273 回答
0

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

例如,假设鼠标单击 GUI 元素。说你的课程有一个方法

handleClick(int x, int y);

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

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

在这种类型的模型中,只有当它是顶级元素时,“父级”才会为空,其余的只会让父级离顶部更近一步。

于 2013-05-20T14:16:17.750 回答