聚合与成分相同吗?

时间:2018-08-22 10:59:40

标签: c# oop vocabulary

美好的一天,

什么是聚合,什么是组成?他们是一样的吗?

据我了解,没有区别。

根据[This Website],它们确实在微妙的方面有所不同。但是我确实认为他们走的路不对...让我解释一下。

在他们的定义中,他们说的是以下几点:(我引用)

  

汇总

     

暗示一种关系,孩子可以独立于   父母。

     

组成

     

暗示一种关系,其中孩子不能独立于   父母。

说“孩子”和“父母”意味着存在“基类”和“派生类”。这意味着实际上这两个类之间存在“是”关系。根据我对关系的理解,因为已经存在“ is-a”关系,所以不能有“ has-a”关系。

请参见下面的代码:

public class Animal
{
...
}
public class Reptile : Animal
{
...
}
public class Mammal : Animal
{
...
}
public class Address
{
 ...
}
public class Zoo
{
 private Address address;
 private Mammal mammal;
 private Reptile reptile;
 private string name;

 ...
}

根据网站给我的定义,“ Zoo”是地址,哺乳动物和爬行动物的派生类,由于“ Zoo”类不继承任何内容,因此我对此表示强烈反对。

我对组成聚合的理解是,当一个班级与另一个班级(如Zoo)具有“有” 关系时一个班级有多个班级。

如果有区别,请帮助我正确理解。

问候 罗恩

1 个答案:

答案 0 :(得分:1)

您是正确的。聚合是使用与其他不相关类不同的独立组件来创建对象或类,而组合使用派生的父子类来专门化行为。

例如,您的Zoo类并不派生自Animal,而是使用其实例。如果您从Animal衍生出灵长类动物或Dog并制作MonkeyZoo或DogZoo,您将在新衍生的Zoo中依赖Animal。

现代的面向对象理论倾向于倾向于聚合而不是组成,因为太多的虚拟派生工具可能会过度专业化并证明令人困惑-更好地构成一类简单的可重用对象并为专业需求而派生它们。

https://javarevisited.blogspot.com/2014/02/ifference-between-association-vs-composition-vs-aggregation.html