我正在阅读过去考试的OOP考试,我遇到了一个问题: 可以使用下面的类定义来实现Person和Brain类之间的组合关系吗?
abstract class Person{
private Brain brain;
Person(Brain humanBrain) {
brain = humanBrain;
}
}
我的印象是,从给出的代码中已经存在两者之间的组合关系,但是因为问题也要求代码样本我认为我错了。关于如何实现构图的解释或者为什么这已经不被认为是两者之间的构图关系,将不胜感激。
答案 0 :(得分:1)
最好将Brain定义为final,将其与Aggregation区分开来,详见此处:http://javarevisited.blogspot.co.uk/2014/02/ifference-between-association-vs-composition-vs-aggregation.html
答案 1 :(得分:1)
我们知道UML组合定义,我们可以在SO和互联网上找到很多例子。 但是,我认为我们应该深入了解。
首先:关于撰写的说明。
在作文(see reference)中:
如果复合(整体)被删除,其所有复合部分都是 “通常”用它删除。
考虑这个例子:
class Person {
private final Brain brain;
Person(Brain humanBrain) {
brain = humanBrain;
}
}
在代码的其他部分,我们可以这样定义:
Brain b = new Brain();
// or we have an instance of Brain in other scopes
// not exactly in this scope
Person p1 = new Person(b);
Person p2 = new Person(b);
因此,在此代码中,我们可以将Brain
的一个实例设置为两个不同的Persons
。
注意:在撰写时,我们应该管理实例的生命周期。只定义任何类的private final
,不要在它们之间显示组合。
例如,以下示例可以是合成。因为删除“整体”时删除了“部分”的实例:
public class House {
private final Room room;
public House() {
room = new Room();
}
}
在作文中:
“整体”可能直接负责“部分”的创建或破坏。或者它可以使用已经从类外部(通过代码的其他部分)创建和管理的“部分”。在这种情况下,删除“部分”应该由外部代码管理,“部分”应该在“整体”删除后立即删除。
我们应该建立一个删除“整体”时删除“部分”的机制。 如果我们不删除“部分”并将其用于其他“整体”,那就是聚合。
总结
检测源代码中的Composition需要完整的代码实现。我们应该确保在删除“整体”时立即删除“部分”。
问题的另一点是抽象。因此,我们在该代码中没有对象组合或对象聚合。
最后:问题中的关系是合成(仅基于人和大脑的概念)。但是,根据给定的源代码,它还不是组合。