继承、组合、委托
2014-04-23 15:54
621 查看
继承、组合、委托
软件设计模式中,有很多经典模式,今天从最基本的继承、组合、委托开始研究(Inheritance、Composition、Delegation)。一、继承(Inheritance)
简单来说,继承就是在原有类A的基础上,新建一个类B,不过新建的类B是在A的基础上,继承父类(A)的属性以及方法。该模式是面相对象的基础。
示例如下:
[cpp] view
plaincopy
#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。比如这样:
[cpp] view
plaincopy
class CMyDoc : public CDocument
{
private:
CObList myList;
};
通俗来讲,组合就是将一个庞大的整体拆开成多个小零件,每个小零件自成一个类,最终在这个整体框架类中将这些零件类对象组合进去。
组合与继承相比而言,继承是类的继承,而组合是对象的组合,这就会出现继承行为子类可以随意修改从父类继承而来的行为,而组合则不能修改,更具有封装性。其二,继承是在编译时刻静态定义的,即是静态复用,在编译后子类和父类的关系就已经确定了。而组合这是运用于复杂的设计,它们之间的关系是在运行时候才确定的,即在对对象没有创建运行前,整体类是不会知道自己将持有特定接口下的那个实现类。在扩展方面组合比集成更具有广泛性。
因此,主流意见推荐是优先使用对象组合。
三、委托(delegation)
委托是将一部分功能分割出去完成,即委托者(delegator)将自己委托给受托者(delegatee),受托者方法中参数为委托者对象;然后委托者调用受托者类对象。
委托与组合的对比:
下面示例是组合
[csharp] view
plaincopy
delegateA {
delegateeB b;
void methodA(); { b.methodB();;}
}
delegateeB {
void methodB(); {}
}
而下面这个才是委托:
[csharp] view
plaincopy
delegateA {
delegateeB b;
void methodA(); { b.methodB(this);; }
void do(); {}
}
delegateeB {
void methodB(delegateA a); { a.do();; }
}
对比发现,委托相比于组合,是在受托者方法中加入了委托者对象。
原地址:http://blog.csdn.net/fengzhongzhishenfu/article/details/23592863
相关文章推荐
- 面向对象编程的3种关系:组合,委托和继承
- C++组合,继承,委托,多态_boolan
- 继承、组合、委托
- 关联、依赖、组合、聚合、接口、实现、继承
- UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)
- golang学习的点点滴滴:利用组合实现继承
- Java--类和对象之组合和继承
- 组合与继承
- 浅谈继承和组合
- 继承、实现、依赖、关联、聚合、组合的联系与区别
- C++ 类的继承和组合
- 继承、实现、依赖、关联、聚合、组合的联系与区别
- 组合未必优于继承
- UML类图关系(继承、泛化、实现、依赖、关联、聚合、组合)
- UML中几种类间关系:继承、实现、依赖、关联、聚合、组合的联系与区别
- 继承、实现、依赖、关联、聚合、组合的联系与区别
- 设计思考之“IComponent-ISite-IContainer 组合还是继承,这是个问题”
- 继承(inheritance)与组合(composition)
- 在程序中使用继承和组合 第五章第十题
- 封装与解耦,组合与继承