繼承、組合、委託
軟件設計模式中,有很多經典模式,今天從最基本的繼承、組合、委託開始研究(Inheritance、Composition、Delegation)。
一、繼承(Inheritance)
簡單來說,繼承就是在原有類A的基礎上,新建一個類B,不過新建的類B是在A的基礎上,繼承父類(A)的屬性以及方法。該模式是面相對象的基礎。
示例如下:
#include <iostream>
using namespace std;
class People
{
public:
string name;
int age;
public:
People()
{
name="";
age=20;
}
People(string n,int a){name=n;age=a;}
int getAge()
{
return age;
}
};
class Worker:People
{
public:
string work;
public :
Worker(string n,int a,string m)
{
People(n,a);
work=m;
}
};
二、組合(Composition)
所謂組合,是指Class object中又有其他class members。比如這樣:
class CMyDoc : public CDocument
{
private:
CObList myList;
};
通俗來講,組合就是將一個龐大的整體拆開成多個小零件,每個小零件自成一個類,最終在這個整體框架類中將這些零件類對象組合進去。
組合與繼承相比而言,繼承是類的繼承,而組合是對象的組合,這就會出現繼承行爲子類可以隨意修改從父類繼承而來的行爲,而組合則不能修改,更具有封裝性。其二,繼承是在編譯時刻靜態定義的,即是靜態複用,在編譯後子類和父類的關係就已經確定了。而組合這是運用於複雜的設計,它們之間的關係是在運行時候才確定的,即在對對象沒有創建運行前,整體類是不會知道自己將持有特定接口下的那個實現類。在擴展方面組合比集成更具有廣泛性。
因此,主流意見推薦是優先使用對象組合。
三、委託(delegation)
委託是將一部分功能分割出去完成,即委託者(delegator)將自己委託給受託者(delegatee),受託者方法中參數爲委託者對象;然後委託者調用受託者類對象。
委託與組合的對比:
下面示例是組合
delegateA {
delegateeB b;
void methodA(); { b.methodB();;}
}
delegateeB {
void methodB(); {}
}
而下面這個纔是委託:
delegateA {
delegateeB b;
void methodA(); { b.methodB(this);; }
void do(); {}
}
delegateeB {
void methodB(delegateA a); { a.do();; }
}
對比發現,委託相比於組合,是在受託者方法中加入了委託者對象。
————————————————
版權聲明:本文爲CSDN博主「lazy_man36」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/fengzhongzhishenfu/article/details/23592863