繼承,組合,委託

繼承、組合、委託

   軟件設計模式中,有很多經典模式,今天從最基本的繼承、組合、委託開始研究(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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章