物件導向程式設計的3種關係 組合,委託和繼承

2021-08-21 17:41:32 字數 1195 閱讀 9825

軟體設計模式中,有很多經典模式,今天從最基本的繼承、組合、委託開始研究(inheritance、composition、delegation)。

一、繼承(inheritance)

簡單來說,繼承就是在原有類a的基礎上,新建乙個類b,不過新建的類b是在a的基礎上,繼承父類(a)的屬性以及方法。該模式是面相物件的基礎。

示例如下:

#include 

using namespace std;

class people

people(string n,int a)

int getage()

};class worker:people

};

二、組合(composition)

所謂組合,是指class object中又有其他class members。比如這樣:

class cmydoc : public cdocument

;

通俗來講,組合就是將乙個龐大的整體拆開成多個小零件,每個小零件自成乙個類,最終在這個整體框架類中將這些零件類物件組合進去。

組合與繼承相比而言,繼承是類的繼承,而組合是物件的組合,這就會出現繼承行為子類可以隨意修改從父類繼承而來的行為,而組合則不能修改,更具有封裝性。其二,繼承是在編譯時刻靜態定義的,即是靜態復用,在編譯後子類和父類的關係就已經確定了。而組合這是運用於複雜的設計,它們之間的關係是在執行時候才確定的,即在對物件沒有建立執行前,整體類是不會知道自己將持有特定介面下的那個實現類。在擴充套件方面組合比整合更具有廣泛性。

因此,主流意見推薦是優先使用物件組合。

三、委託(delegation)

委託是將一部分功能分割出去完成,即委託者(delegator)將自己委託給受託者(delegatee),受託者方法中引數為委託者物件;然後委託者呼叫受託者類物件。

委託與組合的對比:

下面示例是組合

delegatea   

} delegateeb

}

而下面這個才是委託:

delegatea      

void

do(); {}

} delegateeb

}

對比發現,委託相比於組合,是在受託者方法中加入了委託者物件。

原文:

3 物件導向程式設計

基礎型別,如byte int bool float等 復合型別,如陣列 結構體 指標等 可以指向任意物件的型別 any型別 值語義和引用語義 物件導向,即所有具備物件導向特徵 比如成員方法 的型別 介面 type integer int func a integer less b integer b...

物件導向程式設計(3)

封裝有兩方面的含義 1 將資料和行為包裝到類物件中,在方法內部對屬性進行操作,在類物件的外部呼叫方法。無需關心方法內部的具體實現細節,從而提高了複雜度。2 在類物件內部通過訪問控制把某些屬性和方法隱藏起來,不允許在類物件的外部直接訪問,而是在類物件的內部對外提供公開的介面方法以訪問隱藏的資訊。這樣,...

物件導向 物件的組合

組合 乙個類的例項可以當做引數傳給另乙個類的例項 class school def init self,name,address self.name name self.address address class course def init self,name,price,outline,sch...