组合中的对象?
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。
以你的例子为例,继承的一个非常糟糕的例子是:
- 一个
TwoLegs
class那是两条腿
- 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;
}
作为初学者,我一直在学习组合和继承。我意识到在使用组合时,你创建的不是对象而是组合。我在这里有点困惑。假设我们正在建造一个有头、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。
以你的例子为例,继承的一个非常糟糕的例子是:
- 一个
TwoLegs
class那是两条腿 - a
TwoArmsAndTwoLegs
class (subclass ofTwoLegs
) 那是两条胳膊也是两条腿。 - a
HeadAndTwoArmsAndTwoLegs
class (subclass ofTwoArmsAndTwoLegs
) 那是一个头还有两条胳膊和两条腿。 - a
Human
class (subclass ofHeadAndTwoArmsAndTwoLegs
) 那是一个人,也是所有的遗骸。
它不灵活,因为所有 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;
}