2009-06-12 4 views
0

Ich weiß über Association und Aggregation und Zusammensetzung und Generalisierung, was sie per Definition sind. Vererbung ist "ist eine" Beziehung und Zusammensetzung ist "hat eine" Beziehung.Wie Aggregation in Bezug auf einen Programmiercode anzeigen?

Class A { 
} 

Class B extends A { // this is Generalization 
} 

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

jetzt meine Frage ist, wie die Aggregation und einfache Assoziation in Bezug auf Programmcode gezeigt wird. ?

Antwort

1

I vermute, dass deine eigentliche Frage mit der Zusammensetzung gegen die Aggregation zu tun hat. Sie können sich den Unterschied in Bezug auf die Eigentumsverhältnisse vorstellen, aber die wahre Unterscheidung (für mein Geld) ist, was den Lebenszyklus des aggregierten Objekts steuert.

In Zusammensetzung. wenn das zusammengesetzte Objekt zerstört wird, werden seine enthaltenen Teile oder Klassen mit ihm zerstört. Bei der Aggregation kann die Lebensdauer des enthaltenen Objekts unabhängig vom enthaltenen Objekt sein. In Code. Dies hängt davon ab, ob das Komponentenobjekt durch Wert oder Referenz angegeben ist. Aggregation hat durch Referenz (oder Zeiger wie im Beispiel) getan werden. Wenn es nach Wert gemacht wird, wird die Komponente außerhalb des Gültigkeitsbereichs liegen und mit dem enthaltenden Objekt zerstört werden und ist somit die Zusammensetzung.

In diesem Fall ist Engine ein Beispiel für Zusammensetzung und Batterie ein Beispiel für Aggregation.

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

} 

Entschuldigung, wenn das nicht das beste Beispiel ist, aber hoffentlich veranschaulicht es den Hauptpunkt.

0

Ich bin nicht sicher genau, was Sie hier gehen, aber ich würde die folgenden Beispiele zeigen:

Aggregation

public class A { } 
public class List<A> { } // aggregation of A 

Association (Anwendungen)

public class A 
{ 
    public void AMethod() { ... } 

public class B 
{ 
    public void BMethod(A a) 
    { 
     a.AMethod(); // B uses A 
    } 
}