我希望我能就这个问题得到一些澄清。所以类层次结构如下所示: 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类型的参数)。
这可能是一个合理的设计吗?
答案 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方法的哪些元素,但它可能比仅使用父模型更复杂,或者只是更不干净(尽管不总是)。
在这种类型的模型中,“父”将为空的唯一时间是当它是顶级元素时,其余部分将使父母更接近顶部。