在面向對象的程序設計中,類之間有6中關系,分別是繼承, 組合, 聚合,關聯, 依賴,實現,如果使用C語言實現,上面的這些關系通過"結構體包含結構體、結構體包含結構體指針以及函數指針等語法實現",C語言本身的語法並不支持這些邏輯關系的實現,所以使用C語言實現面向對象的程序設計很多時候需要我們自己來關注某一種語法實現兩個類之間到底是什么關系,但是C++/Java/Python等語言原生支持面向對象的程序設計,即這些編程語言的語法本身就可以實現這些類之間的邏輯關系,本文以C++為例,分析這些類關系的含義,下面是本文最終得到的UML類圖示例。
繼承(Generalization)
繼承是面向對象的三大特征之一,是一種最能體現面向對象代碼復用的類關系,對於繼承,可以使用"is a"來表示,比如,小轎車(類B)"is a"車(類A),是對車(類A)的進一步刻畫,那么這兩個類就是"繼承"關系。
class Goose : public Bird{
//子類擴展屬性和方法
};
組合(Composition)
組合是將一個對象(部分)放到另一個對象里(組合)。它是一種 "has-a" 的關系。相比"聚合",組合是一種強所屬關系,組合關系的兩個對象往往具有相同的生命周期,被組合的對象是在組合對象創建的同時或者創建之后創建,在組合對象銷毀之前銷毀。一般來說被組合對象不能脫離組合對象獨立存在,而且也只能屬於一個組合對象。比如,鳥類和翅膀類就是組合關系,在創建一個鳥類對象時,一定要同時或之后創建一個翅膀類對象,銷毀一個鳥類對象時,一定要先同時或之前銷毀翅膀對象。
在C++語法中,使用在一個類中包含另外一個類類型的成員來實現組合。
class Wing{
};
class Bird{
Wing wing;
};
聚合(Aggregation)
聚合是一種弱所屬關系,比如一只大雁和雁群,就是一種"聚合"關系。和組合相比,被聚合的對象可以屬於多個聚合對象,比如,一只大雁可能屬於多個雁群。
在C++語法中,通過類的指針來實現聚合
class Goose{
};
class Geese{
public:
Goose member[10];
};
關聯(Association)
關聯也是一種弱關系,但並不是從屬關系,關聯的連個的類可以看作是平等的,比如一只大雁和老鷹的關系,就可以看作關聯關系
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)
實現對應的是面向對象中的"接口",即動物都要移動,但是每種移動的方式不一樣,鳥要實現自己獨有的移動的方法。
在C++中,接口通過的純虛函數來實現,C++的多態就是通過虛函數來實現的。
class Animal{
public:
vitual void move();
};
class Bird: public Animal{
void move(){
//鳥的移動方式,飛
}
};