[轉載]繼承(Generalization),組合(Composition),聚合(Aggregation),關聯(Association),依賴(Dependency),實現(Realization

June_we發表於2018-08-10

原文連結:https://www.cnblogs.com/h-hg/p/8784232.html

類與類的關係

  來源

繼承(Generalization)

 &esmp;繼承是物件導向的三大特徵之一,是一種最能體現物件導向程式碼複用的類關係,對於繼承,可以使用"is a"來表示,比如,小轎車(類B)"is a"車(類A),是對車(類A)的進一步刻畫,那麼這兩個類就是"繼承"關係。

class Goose : public Bird{
    //子類擴充套件屬性和方法
};

組合(Composition)

 &esmp;組合是將一個物件(部分)放到另一個物件裡(組合)。它是一種 "has-a" 的關係。相比"聚合",組合是一種強所屬關係,組合關係的兩個物件往往具有相同的生命週期,被組合的物件是在組合物件建立的同時或者建立之後建立,在組合物件銷燬之前銷燬。一般來說被組合物件不能脫離組合物件獨立存在,而且也只能屬於一個組合物件。比如,鳥類和翅膀類就是組合關係,在建立一個鳥類物件時,一定要同時或之後建立一個翅膀類物件,銷燬一個鳥類物件時,一定要先同時或之前銷燬翅膀物件。
 &esmp;在C++語法中,使用在一個類中包含另外一個類型別的成員來實現組合。

class Wing{
};
class Bird{
    Wing wing;
};

聚合(Aggregation)

 &esmp;聚合是一種弱所屬關係,比如一隻大雁和雁群,就是一種"聚合"關係。和組合相比,被聚合的物件可以屬於多個聚合物件,比如,一隻大雁可能屬於多個雁群。
 &esmp;在C++語法中,通過類的指標來實現聚合

class Goose{
};
class Geese{
    public:
        Goose member[10];
};

關聯(Association)

  關聯也是一種弱關係,但並不是從屬關係,關聯的連個的類可以看作是平等的,比如一隻大雁和老鷹的關係,就可以看作關聯關係
 &esmp;C++中,通過定義其他類指標型別的成員來實現關聯,下面是雙向關聯的實現方法

class Egle{
    class Goose *food;
};
class Goose{
    class Egle *predator;
};

依賴(Dependency)

  一個物件的某種行為依賴於另一個類,比如,大雁的遷徙行為受季節影響,那麼,大雁和季節就會有"依賴"關係。
  C++語法中,通過將一個類作為另一類方法的引數的形式實現兩個類之間的依賴關係

class Season{
}; 
class Goose{
    public:
       void Migrate(Season season); //或Migrate(Season *season)、Migrate(Season &season)
};

實現(Realization)

  實現對應的是物件導向中的"介面",即動物都要移動,但是每種移動的方式不一樣,鳥要實現自己獨有的移動的方法。
 &esmp;在C++中,介面通過的純虛擬函式來實現,C++的多型就是通過虛擬函式來實現的。

class Animal{
    public:
        vitual void move();
};
class Bird: public Animal{
    void move(){
        //鳥的移動方式,飛
    }
};

 

相關文章