【问题标题】:Implementing a composition relationship in an abstract class definition在抽象类定义中实现组合关系
【发布时间】:2018-01-01 18:03:54
【问题描述】:

我正在查看过去的 OOP 考试试卷,并且遇到了一个问题: 下面的类定义能否用于实现 Person 类和 Brain 类之间的组合关系?

abstract class Person{
   private Brain brain;
   Person(Brain humanBrain) {
      brain = humanBrain;
   }
}

我的印象是,从给出的代码来看,两者之间已经存在组合关系,但是由于问题还要求提供代码示例,我认为我错了。解释如何实现组合,或者为什么这已经不被视为两者之间的组合关系,将不胜感激。

【问题讨论】:

  • 有(有)大脑;构图清晰。
  • 那个类定义已经实现了Person和Brain之间的组合关系。也许答案只是“是”,您可以继续前进吗?因为你的印象是对的,所以这里没有什么可解释的了。
  • 私人?也许protected Brain brain;

标签: java oop


【解决方案1】:

我们知道 UML 组合定义,我们可以在 SO 和 Internet 中找到很多示例。 但是,我认为我们应该深入研究。

首先:关于作曲的说明。
在作文(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,不显示它们之间的Composition。

例如,下面的示例可以是合成。因为删除“整体”时删除了“部分”的实例:

public class House {    
   private final Room room;

   public House() {    
       room = new Room();
   }
}

作曲:
“整体”可能直接负责“部分”的创建或破坏。或者它可能使用已经从类外部(由代码的其他部分)创建和管理的“部分”。在这种情况下,“部分”的删除应由外部代码管理,“部分”应在“整体”删除后立即删除。

我们应该建立在删除“整体”时删除“部分”的机制。 如果我们不删除“部分”并在其他“整体”中使用它,那就是聚合

总结一下
检测源代码中的组合需要有完整的代码实现。并且我们应该确保在删除“整体”时立即删除“部分”。

问题的另一点是抽象。所以我们在该代码中没有对象组合或对象聚合。

最后:问题中的关系是Composition(仅基于Person和Brain的概念)。但是,从给定的源代码来看,它还不是 Composition。

【讨论】:

    【解决方案2】:

    最好将 Brain 定义为 final,将其与 Aggregation 区分开来,详见此处:http://javarevisited.blogspot.co.uk/2014/02/ifference-between-association-vs-composition-vs-aggregation.html

    【讨论】:

      猜你喜欢
      • 2013-08-21
      • 1970-01-01
      • 2019-05-03
      • 1970-01-01
      • 2017-02-11
      • 1970-01-01
      • 1970-01-01
      • 2019-12-01
      • 1970-01-01
      相关资源
      最近更新 更多