首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在编程代码中显示聚合?

如何在编程代码中显示聚合?
EN

Stack Overflow用户
提问于 2009-06-12 01:13:09
回答 2查看 846关注 0票数 0

我知道关联、聚合、组合和泛化,它们的定义是什么。继承是“是”关系,而组合是“有”关系。

代码语言:javascript
复制
Class A {
}

Class B extends A { // this is Generalization
}

Class C {
 A ob;  // this is composition
}

现在我的问题是聚合和简单关联是如何在编程代码中显示的。?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-06-12 14:47:48

我怀疑你真正的问题是关于组合还是聚合。您可以考虑所有权方面的差异,但真正的区别(对于我来说)是控制聚合对象的生命周期的。

在构图上。当组合对象被销毁时,其包含的部分或类也将被销毁。使用聚合,包含对象的生命周期可以独立于包含对象。在代码中。这归结于component对象是由值指定还是由引用指定。聚合必须通过引用(或本例中的指针)来完成。如果它是通过值完成的,则组件部分将超出范围,并与包含对象一起销毁,因此是组合。

因此,在这种情况下,Engine是一个组合的例子,Battery是一个聚合的例子。

代码语言:javascript
复制
#include <iostream>

using namespace std;

class Engine
{
   public:

      Engine() {cout << "Engine created\n";};
     ~Engine() {cout << "Engine destroyed\n";};
};


class Battery
{
   public:

      Battery() {cout << "Battery created\n\n";};
     ~Battery() {cout << "\nBattery destroyed\n";};
};

class Car
{
   private:

      Battery *bat;
      Engine  eng;  //Engine will go out of scope with Car

   public:

      Car(Battery* b) : bat(b) {cout << "Car created\n";};
     ~Car() {cout << "Car destroyed\n";};

       void drive(int miles) {/*...*/};
};



int main(int argc, char *argv[])
{
   //a Battery lifecycle exists independently of a car
   Battery* battery = new Battery();

   //but a car needs to aggregate a Battery to run
   Car* car1 = new Car(battery);

   car1->drive(5);

   //car1 and its Engine destroyed but not the Battery
   delete car1;

   cout << "---------------\n";

   //new car, new composed Engine, same old Battery
   Car* car2 = new Car(battery);

   car2->drive(5);
   delete car2;

   //destroy battery independently of the cars
   delete battery;

}

如果这不是最好的例子,很抱歉,但希望它说明了主要观点。

票数 1
EN

Stack Overflow用户

发布于 2009-06-12 01:29:52

我不确定您在这里到底要做什么,但我建议使用以下示例:

聚合

代码语言:javascript
复制
public class A { }
public class List<A> { }  // aggregation of A

关联(使用)

代码语言:javascript
复制
public class A
{
    public void AMethod() { ... }

public class B
{
    public void BMethod( A a )
    {
         a.AMethod();  // B uses A
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/984582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档