保持一个类的对象和聚合它们有什么区别?

时间:2008-12-15 15:01:18

标签: oop class relationship

我无法区分聚合和持有之间的区别。就C ++来说,这意味着什么呢? 我想当A类的对象持有(或实例化)B类对象时,它会使用它来自行执行某些功能。
例如:

class A {
 int state;
 public: 
  A(int s): state(s) {}
  int inc() { return state++; }
};
class B {
  int app;
  string s;
public:
  B(): app(0), s("") {}
  B(int A, const string& str): app(A), s(str) {}
  void f(int p);
  ~B() { app = 0; s = ""; }
};
void B::f(int p)
{
   A mA(p);
   app = mA.inc();
}

A类对象的聚合如下:

class B{
 A t;
 //...
}

请给我一个指向网站或书籍中某个地方的链接,在那里我可以找到关于OO语言的明确定义,确切地说每个类之间的关系是什么。

3 个答案:

答案 0 :(得分:1)

持有另一个类意味着一个类通过父子关系与另一个类相关联。例如,Path有一个点列表。 Path是Points List的父级,它是各个点的父级。

聚合意味着使用不同的类并将它们放在接口后面,以便它们显示为一个类。例如,FileDialog将具有多个按钮类,文本输入类,listview / treeview类等。但是对于系统的其余部分,它只需要激活方法,可以分配默认文件名,然后检索其余文件。

它由所有其他类组成的事实对于使用它作为filedialog的其他类来说并不重要。但是它通过聚合所有类来执行预期的行为。

答案 1 :(得分:1)

IMO,如果我理解正确的话,你要求定义组合与聚合。聚合或保留是实体的集合。构图具有更严格的约束。考虑给予学生的平均分数:当我们计算平均分时,我们不能排除任何项目。组成与此类似。没有项目可以错过。另一方面,聚合的定义更为松散。

一个有趣的比喻是箭袋和汽车的箭袋。箭袋是箭的聚合体,箭可以不带箭头存在;汽车是一种组合(零件总和)。不要说没有车轮的汽车仍然是汽车:)

至于参考文献:http://www.bletchleypark.net/algorithms/software/oop.html

答案 2 :(得分:0)

这非常关乎所有权和知名度。这些关系有不同的名称,但您应该考虑以下两点:

  • 父母是否对孩子有严格的所有权,这样当父母去世时,孩子也应该死?

  • 除了父母之外,其他实体是否可以看到孩子?

这些问题的答案将帮助您澄清这些关系。