C++进阶--代码复用 继承vs组合

//############################################################################
/*
 * 代码复用: 继承 vs 组合
 */

//继承实现代码复用
class BaseDog {
   ...
   ... // 公共的操作
};

class BullDog : public BaseDog {
   ... // 调用公共操作,执行更多任务
};

class ShepherdDog : public BaseDog {
   ... // 调用公共操作,执行更多任务
};

// 组合实现代码复用

class ActivityManager {
   ... // 公共操作
};

class Dog {
   ...
};

class BullDog : public Dog {
   ActivityManager* pActMngr;
   ... //  通过pActMngr调用公共操作
};

class ShepherdDog : public Dog {
   ActivityManager* pActMngr;
   ... // 通过pActMngr调用公共操作
};

/*
 * 代码复用: 组合优于继承
 *
 * 1. 复用者和被复用者之间具有更少的代码耦合
 *    a. 子类自动继承父类所有的公有成员
 *    b. 子类可以访问父类的保护成员
 *       - 继承破坏了封装性
 */

/*
 * 2. 动态绑定
 *    a. 继承在编译时绑定
 *    b. 组合可以在编译时绑定,也可以在运行时绑定
 */

class OutdoorActivityManager : public ActivityManager {...}

class IndoorActivityManager : public ActivityManager {...}

/*
 * 3. 灵活的代码结构
 *
 *    Dog             ActivityManager
 *
 *    BullDog         OutdoorActivityManager
 *    ShepherdDog     IndoorActivityManager
 *    ...             ...
 */

// 组合的例子:只从纯虚类继承
class ActivityManager {
   void eatBiscuit() { ... }
};

class Dog {
   ...
   virtual void eatBiscuit() = 0;
};

class BullDog : public Dog {
   ActivityManager* pActMngr;
   ...
   void eatBiscuit() { pActMngr->eatBiscuit(); }
};

class ShepherdDog : public Dog {
   ActivityManager* pActMngr;
   ...
   void eatBiscuit() { pActMngr->eatBiscuit(); }
};

原文地址:https://www.cnblogs.com/logchen/p/10176901.html

时间: 2024-10-13 16:45:10

C++进阶--代码复用 继承vs组合的相关文章

代码复用原则:合理使用类组合和类继承

继承和组合都可以达到代码复用的目的,但是组合比继承更具灵活性.组合是通过引用已有类(一般为抽象类)或接口来实现复用的组合在运行时通过多态可以动态替换被组合的对象.继承是通过以子类继承父类方式来使父类的非私有成员可以被其子类使用.继承在类编译时就确定了继承来的方法和 属性,无法在运行时动态改变从父类继承来的方法.如果继承得来的某个方法在子类中不适用,这时就需要重写该方 法.而这样又很有可能违反LSP设计原则.如果父类非私有成员发生了改变那么继承他的子类也不得不发生改变父类改 变.所以这种复用方式仅

子类继承父类 ( 代码复用 )

<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>无标题文档</title> <script> //继承 : 子类不影响父类,子类可以继承父类的一些功能 ( 代码复用 ) //属性的继承 : 调用父类的构造函数 call //

9. 实现类复用的两个手段——继承与组合

一.实现类复用概述 1. 如果需要复用一个类,可以把这个类当成基类来继承 如果访问权限允许,子类可以直接访问父类的成员变量和方法,相当于子类可以直接复用父类的成员变量和方法 继承带来高度复用的同时,也严重地破坏了父类的封装性 如果只是出于类复用的目的,并不一定需要使用继承,完全可以使用组合来实现 2. 如果需要复用一个类,还可以把这个类当成新类的组合成分 新类可以直接复用这个类的public成员变量和方法 二.实现类复用的补充说明 1. 继承方式中,子类可以直接获得父类的public方法,程序使

Objective-C基础1:OC中类的继承和组合

1.类的定义和声明 OC中的类声明是以@interface开始@end结束. OC中的类定义以@implementation开始@end结束. OC中的方法声明: - (void) setName : (NSString*) strName;前面的短线-表示这是一个方法,(void)表示返回值, setName表示方法名称,(NSString*) StrName表示参数是NSString*类型,名称是strName,注意:()一定要加 OC中的成员变量定义在类声明的{}中,这一点跟方法声明不一样

[Think In Java]基础拾遗1 - 对象初始化、垃圾回收器、继承、组合、代理、接口、抽象类

目录 第一章 对象导论第二章 一切都是对象第三章 操作符第四章 控制执行流程第五章 初始化与清理第六章 访问权限控制第七章 复用类第九章 接口 第一章 对象导论 1. 对象的数据位于何处? 有两种方式在内存中存放对象: (1)为了追求最大的执行速度,对象的存储空间和生命周期可以在编写程序时确定,这可以通过将对象置于堆栈或者静态存储区域内来实现.这种方式牺牲了灵活性. (2)在被称为堆的内存池中动态地创建对象.在这种方式,知道运行时才知道对象需要多少对象,它们的生命周期如何,以及它们的具体类型.

继承和组合

1.继承可以使得子类具有父类的各种属性和方法,而不需要再次编写相同的代码.在令子类继承父类的同时,可以重新 定义某些属性,并重写某些方法,即覆盖父类的原有属性和方法,使其获得与父类不同的功能.又称为"白盒式复 用". 2.组合,是指通过对现有的对象进行组合残生新的更复杂的功能,因为在对象之间,各自的内部细节是不可见的,所 以,我们也说这种方式的代码复用是"黑盒式代码复用".

Atitit 代码复用的理解attilax总结

1.1. 继承1 1.1.1. 模式1:原型继承1 1.1.2. 模式2:复制所有属性进行继承 拷贝继承1 1.1.3. 模式3:混合(mix-in)1 1.1.4. 模式4:借用方法1 1.2. 组合2 1.3. API提供了一种代码复用的机制.2 1.4. 类库机制2 1.5. Include import2 1.6. Cfg2 1.7. 良好的复用和不良的复用2 1.8. 可复用组件的 5 种类型  代码块 Code Block算法 模式   数据类型 库3 1.9. 2. 算法 Algo

javascript代码复用(四)-混入、借用方法和绑定

这篇继续说js的现代复用模式:混入.借用方法和绑定. 混入 可以针对前面提到的通过属性复制实现代码复用的想法进行一个扩展,就是混入(mix-in).混入并不是复制一个完整的对象,而是从多个对象中复制出任意的成员并将这些成员组合成一个新的对象. 混入的实现并不难,只需要遍历每个参数,并且复制出传递给这个函数的每个对象中的每个属性. function mix(){ var arg,prop,child={}; for(arg=0:arg<arguments.length;arg++){ for(ar

javascript代码复用模式

原文链接:http://www.faceye.net/search/143351.html 代码复用有一个著名的原则,是GoF提出的:优先使用对象组合,而不是类继承.在中,并没有类的概念,所以代码的复用,也并不局限于类式继承.javascript中创建对象的方法很多,有构造函数,可以使用new创建对象,并且可以动态的修改对象.javascript的非类式继承(可称为现代继承模式)复用方法也很多,例如,利用其它对象组合成所需要的对象,对象混入技术,借用和复用所需要的方法. 类式继承模式-默认模式