继承、组合、委托

继承、组合、委托

       软件设计模式中,有很多经典模式,今天从最基本的继承、组合、委托开始研究(Inheritance、Composition、Delegation)。

一、继承(Inheritance)

        简单来说,继承就是在原有类A的基础上,新建一个类B,不过新建的类B是在A的基础上,继承父类(A)的属性以及方法。该模式是面相对象的基础。

       示例如下:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include <iostream>  
  2. using namespace std;  
  3. class People  
  4. {  
  5. public:  
  6.     string name;  
  7.     int age;  
  8. public:  
  9.     People()  
  10.     {  
  11.         name="";  
  12.         age=20;  
  13.     }  
  14.     People(string n,int a){name=n;age=a;}  
  15.     int getAge()  
  16.     {  
  17.         return age;  
  18.     }  
  19. };  
  20.   
  21. class Worker:People  
  22. {  
  23. public:  
  24.     string work;  
  25. public :  
  26.     Worker(string n,int a,string m)  
  27.     {  
  28.         People(n,a);  
  29.         work=m;  
  30.     }  
  31. };  

二、组合(Composition)

        所谓组合,是指Class object中又有其他class members。比如这样:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. class CMyDoc : public CDocument  
  2. {  
  3. private:  
  4.       CObList myList;  
  5. };  

        通俗来讲,组合就是将一个庞大的整体拆开成多个小零件,每个小零件自成一个类,最终在这个整体框架类中将这些零件类对象组合进去。

        组合与继承相比而言,继承是类的继承,而组合是对象的组合,这就会出现继承行为子类可以随意修改从父类继承而来的行为,而组合则不能修改,更具有封装性。其二,继承是在编译时刻静态定义的,即是静态复用,在编译后子类和父类的关系就已经确定了。而组合这是运用于复杂的设计,它们之间的关系是在运行时候才确定的,即在对对象没有创建运行前,整体类是不会知道自己将持有特定接口下的那个实现类。在扩展方面组合比集成更具有广泛性。

        因此,主流意见推荐是优先使用对象组合。

三、委托(delegation)

委托是将一部分功能分割出去完成,即委托者(delegator)将自己委托给受托者(delegatee),受托者方法中参数为委托者对象;然后委托者调用受托者类对象。

         委托与组合的对比:
        下面示例是组合
[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. delegateA {    
  2.    delegateeB b;    
  3.       
  4.    void methodA(); { b.methodB();;}    
  5. }    
  6.     
  7. delegateeB {    
  8.      void methodB(); {}    
  9. }    

         而下面这个才是委托:
[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. delegateA {    
  2.     delegateeB b;    
  3.     
  4.      void methodA(); { b.methodB(this);; }       
  5.      void  do(); {}    
  6. }    
  7.     
  8. delegateeB {    
  9.      void methodB(delegateA a); { a.do();; }    
  10. }    

         对比发现,委托相比于组合,是在受托者方法中加入了委托者对象。
原地址:http://blog.csdn.net/fengzhongzhishenfu/article/details/23592863
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值