2009-06-12 2 views
0

Я знаю об Ассоциации и Агрегации и Состав и Обобщение, что они по определению. Наследование - это «есть» отношение, а состав «имеет» отношения.Как показать агрегацию с точки зрения кода программирования?

Class A { 
} 

Class B extends A { // this is Generalization 
} 

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

Теперь мой вопрос заключается в том, как агрегирование и простая ассоциация показаны в терминах кода программирования. ?

ответ

1

I подозревайте, что ваш реальный вопрос связан с составом и агрегацией. Вы можете думать о различии в условиях владения, но реальное различие (для моих денег) - это то, что контролирует жизненный цикл агрегированного объекта.

В составе. когда скомпонованный объект уничтожается, его содержащиеся части или классы уничтожаются вместе с ним. При агрегировании время жизни объекта объекта может быть не зависящим от объекта-объекта. В коде. это сводится к тому, указан ли объект компонента по значению или ссылке. Агрегация имеет значение по ссылке (или указателю, как в примере). Если это делается по значению, компонентная часть выйдет за пределы области действия и будет уничтожена с помощью содержащего объекта и, таким образом, будет составной.

Так что в этом случае двигатель является примером композиции и Аккумуляторным примером Агрегации.

#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; 

} 

Извините, если это не лучший пример, но, надеюсь, он иллюстрирует основной момент.

0

Я не уверен, что именно вы собираетесь здесь, но я хотел бы предложить следующие примеры:

Агрегирование

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 
    } 
}