组合中的对象?

Objects in composition?

作为初学者,我一直在学习组合和继承。我意识到在使用组合时,你创建的不是对象而是组合。我在这里有点困惑。假设我们正在建造一个有头、2 条胳膊和 2 条腿的人。

通常,我会做的是创建手臂腿部和头部 classes,然后创建由它们构建的对象 human。但是在组合中,你反而构建了一个与其他 classes 链接的人类 class?我哪里错了?

作文:

class Human {
  Head head;
  Arm leftArm, rightArm;
  Leg leftLeg, rightLeg;
}

如果您在另一个 class 中使用对象(如头部),您就创建了一个合成。

继承:

class Woman extends Human {
}

组合示例:考虑汽车和该汽车非常特定的发动机的示例(这意味着它不能用于任何其他汽车)。 Car 和 SpecificEngine class 之间的这种关系称为 Composition。没有 SpecificEngine class 的对象,Car class 的对象就不能存在,没有 Car class,SpecificEngine 的对象就没有意义。简单来说,Car class 仅 "owns" SpecificEngine class.

聚合示例:现在考虑 class 汽车和 class 车轮。 Car 需要一个 Wheel 对象才能运行。意思是 Car 对象拥有 Wheel 对象,但我们不能说没有 Car 对象,Wheel 对象就没有意义。它可以很好地用于自行车、卡车或不同的汽车对象。

当 Neo(来自 Matrix)通过将其下载到他的大脑中来学习 Kung-Fu 时,它被称为 composition(你给 object 一个协议来符合,或 'connect' 与其他 object 不同)。但是 Neo 不会有 Trinity 的眼睛颜色,因为它们没有关系(只有在 Matrix 中才有可能,在现实生活中没有)。

如果 Neo 和 Trinity 会有一个 child,她不会知道 Kung-Fu(除非后来她被明确介绍到与 Neo 相同的下载),但仍然会有 Trinity 的眼睛.那就是继承

的确,你错了。

组合通常被认为是继承的替代方法,但在这两种情况下,您都可以操纵 classes 的实例,而不仅仅是您为组合情况假设的 classes。

以你的例子为例,继承的一个非常糟糕的例子是:

  • 一个TwoLegsclass那是两条腿
  • a TwoArmsAndTwoLegs class (subclass of TwoLegs) 那是两条胳膊也是两条腿。
  • a HeadAndTwoArmsAndTwoLegs class (subclass of TwoArmsAndTwoLegs) 那是一个头还有两条胳膊和两条腿。
  • a Human class (subclass of HeadAndTwoArmsAndTwoLegs) 那是一个人,也是所有的遗骸。

它不灵活,因为所有 classes 在它们的层次结构和它们的结构定义本身中都密切相关。

在这里,组合将有一个拥有 5 个字段的人类 class:

  • 腿部的rightLeg字段class
  • 腿部的leftLeg字段class
  • 手臂的leftArm场class
  • 手臂的rightArm场class
  • 头部的head字段class

is-a 关系是继承,has-a 关系是组合。

class经理扩展员工{ } // 这称为继承,因为所有经理都是员工。

class经理扩展员工{ 团队 team = new Team();

}

这里经理有一个团队要管理,所以这属于组合。(有关系)

Composition : 由于Engine是Car的一部分,所以它们之间的关系是Composition。以下是它们在 Java 类.

之间的实现方式
public class Car {
    //final will make sure engine is initialized
    private final Engine engine;  

    public Car(){
       engine  = new Engine();
    }
}

class Engine {
    private String type;
}

Aggregation : 由于 Organization 有 Person 作为雇员,他们之间的关系是 Aggregation。这是他们在 Java 类

方面的样子
public class Organization {
    private List employees;
}

public class Person {
    private String name;   
}