在面向對象的程序設計中,類之間有6中關係,分別是繼承, 組合, 聚合,關聯, 依賴,實現,若是使用C語言實現,上面的這些關係經過"結構體包含結構體、結構體包含結構體指針以及函數指針等語法實現",C語言自己的語法並不支持這些邏輯關係的實現,因此使用C語言實現面向對象的程序設計不少時候須要咱們本身來關注某一種語法實現兩個類之間究竟是什麼關係,可是C++/Java/Python等語言原生支持面向對象的程序設計,即這些編程語言的語法自己就能夠實現這些類之間的邏輯關係,本文以C++爲例,分析這些類關係的含義,下面是本文最終獲得的UML類圖示例。
編程
繼承是面向對象的三大特徵之一,是一種最能體現面向對象代碼複用的類關係,對於繼承,可使用"is a"來表示,好比,小轎車(類B)"is a"車(類A),是對車(類A)的進一步刻畫,那麼這兩個類就是"繼承"關係。編程語言
class Goose : public Bird{ //子類擴展屬性和方法 };
組合是將一個對象(部分)放到另外一個對象裏(組合)。它是一種 "has-a" 的關係。相比"聚合",組合是一種強所屬關係,組合關係的兩個對象每每具備相同的生命週期,被組合的對象是在組合對象建立的同時或者建立以後建立,在組合對象銷燬以前銷燬。通常來講被組合對象不能脫離組合對象獨立存在,並且也只能屬於一個組合對象。好比,鳥類和翅膀類就是組合關係,在建立一個鳥類對象時,必定要同時或以後建立一個翅膀類對象,銷燬一個鳥類對象時,必定要先同時或以前銷燬翅膀對象。
在C++語法中,使用在一個類中包含另一個類類型的成員來實現組合。函數
class Wing{ }; class Bird{ Wing wing; };
聚合是一種弱所屬關係,好比一隻大雁和雁羣,就是一種"聚合"關係。和組合相比,被聚合的對象能夠屬於多個聚合對象,好比,一隻大雁可能屬於多個雁羣。
在C++語法中,經過類的指針來實現聚合設計
class Goose{ }; class Geese{ public: Goose member[10]; };
關聯也是一種弱關係,但並非從屬關係,關聯的連個的類能夠看做是平等的,好比一隻大雁和老鷹的關係,就能夠看做關聯關係
C++中,經過定義其餘類指針類型的成員來實現關聯,下面是雙向關聯的實現方法指針
class Egle{ class Goose *food; }; class Goose{ class Egle *predator; };
一個對象的某種行爲依賴於另外一個類,好比,大雁的遷徙行爲受季節影響,那麼,大雁和季節就會有"依賴"關係。code
C++語法中,經過將一個類做爲另外一類方法的參數的形式實現兩個類之間的依賴關係對象
class Season{ }; class Goose{ public: void Migrate(Season season); //或Migrate(Season *season)、Migrate(Season &season) };
實現對應的是面向對象中的"接口",即動物都要移動,可是每種移動的方式不同,鳥要實現本身獨有的移動的方法。
在C++中,接口經過的純虛函數來實現,C++的多態就是經過虛函數來實現的。blog
class Animal{ public: vitual void move(); }; class Bird: public Animal{ void move(){ //鳥的移動方式,飛 } };