面向对象编程的3种关系:组合,委托和继承

软件设计模式中,有很多经典模式,今天从最基本的继承、组合、委托开始研究(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();; }  
}  

对比发现,委托相比于组合,是在受托者方法中加入了委托者对象。

原文:https://blog.csdn.net/fengzhongzhishenfu/article/details/23592863

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值