作为初学者,我一直在学习构图和继承。我意识到在使用合成时,你不是创建对象而是创建合成。我在这里有点困惑。让我们说我们正在建造一个头部,两条腿和两条腿的人。
通常,我要做的是创建手臂腿和头部类,然后创建由这些人构建的人类对象。但是在构图中,你建立了一个与其他类相关联的人类?我哪里错了?
答案 0 :(得分:4)
成分:
class Human {
Head head;
Arm leftArm, rightArm;
Leg leftLeg, rightLeg;
}
如果在另一个类中使用对象(如Head),则可以创建合成。
继承:
class Woman extends Human {
}
答案 1 :(得分:3)
组成示例:考虑汽车和发动机的示例,该汽车和发动机非常特定于该汽车(意味着它不能用于任何其他汽车)。 Car和SpecificEngine类之间的这种关系称为组合。没有SpecialEngine类的对象,Car类的对象不能存在,而没有Car类,SpecificEngine的对象没有意义。简单来说,Car class只“拥有”SpecificEngine类。
聚合示例:现在考虑类Car和类Wheel。汽车需要Wheel对象才能运行。含义Car对象拥有Wheel对象但我们不能说没有Car Object对象没有意义。它可以很好地用于自行车,卡车或不同的汽车对象。
答案 2 :(得分:3)
确实,你错了。
组合通常被认为是继承的替代方法,但在这两种情况下,您都可以操作类的实例而不仅仅是组合案例中的类。
以您的示例为例,一个非常糟糕的继承示例是:
TwoLegs
类是两条腿。TwoArmsAndTwoLegs
类(TwoLegs
的子类),它是两条臂但也是两条腿。HeadAndTwoArmsAndTwoLegs
类(TwoArmsAndTwoLegs
的子类),它是一个头部但也有两条腿和两条腿。Human
类(HeadAndTwoArmsAndTwoLegs
的子类),它是一个人,但也是所有遗体。它并不灵活,因为所有类的层次结构与其结构的定义本身密切相关。
这里,组合将拥有一个拥有5个字段的Human类:
rightLeg
字段leftLeg
字段leftArm
字段rightArm
字段head
字段答案 3 :(得分:2)
当Neo(来自Matrix)通过将Kung-Fu下载到他的大脑中来学习Kung-Fu时,它被称为组合(您为对象提供符合或“连接”其他不同对象的协议它)。但Neo不会有三位一体的眼睛颜色,因为它们没有相关性(它只能在Matrix中,而不是在现实生活中)。
如果Neo和Trinity有一个孩子,她就不会知道Kung-Fu(除非后来她明确地介绍了与Neo相同的下载),但仍然会有Trinity的眼睛。这是继承。
答案 4 :(得分:1)
组成:由于引擎是汽车的一部分,它们之间的关系是组合。以下是它们在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;
}
聚合:由于组织将Person作为员工,因此它们之间的关系是聚合。以下是它们在Java类
方面的外观public class Organization {
private List employees;
}
public class Person {
private String name;
}
答案 5 :(得分:0)
is-a relationship是一种继承,并且has-a Relationship是一种组合。
班级经理扩展员工{ } //这称为继承,因为所有Manager都是Employee。
班级经理扩展员工{ 团队团队=新团队();
}
这里经理有一个团队来管理,所以这是由组成。(有一个关系)