2009-06-12 8 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 
    } 
} 
関連する問題