我知道关联、聚合、组合和泛化,它们的定义是什么。继承是“是”关系,而组合是“有”关系。
Class A {
}
Class B extends A { // this is Generalization
}
Class C {
A ob; // this is composition
}现在我的问题是聚合和简单关联是如何在编程代码中显示的。?
发布于 2009-06-12 14:47:48
我怀疑你真正的问题是关于组合还是聚合。您可以考虑所有权方面的差异,但真正的区别(对于我来说)是控制聚合对象的生命周期的。
在构图上。当组合对象被销毁时,其包含的部分或类也将被销毁。使用聚合,包含对象的生命周期可以独立于包含对象。在代码中。这归结于component对象是由值指定还是由引用指定。聚合必须通过引用(或本例中的指针)来完成。如果它是通过值完成的,则组件部分将超出范围,并与包含对象一起销毁,因此是组合。
因此,在这种情况下,Engine是一个组合的例子,Battery是一个聚合的例子。
#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;
}如果这不是最好的例子,很抱歉,但希望它说明了主要观点。
发布于 2009-06-12 01:29:52
我不确定您在这里到底要做什么,但我建议使用以下示例:
聚合
public class A { }
public class List<A> { } // aggregation of A关联(使用)
public class A
{
public void AMethod() { ... }
public class B
{
public void BMethod( A a )
{
a.AMethod(); // B uses A
}
}https://stackoverflow.com/questions/984582
复制相似问题