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(); }
};
C++进阶--代码复用 继承vs组合的更多相关文章
- Go语言中的代码重用 - 继承还是组合?
故事要从我在一个项目中,想要假装的专业一点而遇到的一个陷阱说起. 代码重用 在这个项目中,我们已经有了类似如下的代码: package main import ( "fmt" ) ...
- javascript代码复用--继承
由于javascript没有类的概念,因此无法通过接口继承,只能通过实现继承.实现继承是继承实际的方法,javascript中主要是依靠原型链要实现. 原型链继承 原型链继承是基本的继承模式,其本质是 ...
- java代码复用(继承,组合以及代理)
作为一门面向对象开发的语言,代码复用是java引人注意的功能之一.java代码的复用有继承,组合以及代理三种具体的表现形式,下面一一道来. 第一种方式是通过按照现有的类的类型创建新类的方式实现代码的复 ...
- Rust 中的继承与代码复用
在学习Rust过程中突然想到怎么实现继承,特别是用于代码复用的继承,于是在网上查了查,发现不是那么简单的. C++的继承 首先看看c++中是如何做的. 例如要做一个场景结点的Node类和一个Sprit ...
- Java代码复用的三种常用方式:继承、组合和代理
复用代码是Java众多引人注目的功能之一.这句话很通顺,没什么问题,但问题在于很多人并不清楚“复用”是什么.就好像我说“沉默王二是一个不止会写代码的程序员”,唉,沉默王二是谁? 我们需要来给“复用”下 ...
- Java——代码复用(组合和继承)
前言 "复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对之加以改变是不够的,它必须还能够做更多的事情." Java解决问题都围绕类展开的, ...
- PHP代码的多继承 -》 PHP代码复用新的姿势 trait
本文参考: http://php.net/language.oop5.traits 一.什么是trait 从PHP 5.4.0 开始 PHP 实现了一种新的代码复用方式 trait. 二.trait ...
- Atitit 代码复用的理解attilax总结
Atitit 代码复用的理解attilax总结 1.1. 继承1 1.1.1. 模式1:原型继承1 1.1.2. 模式2:复制所有属性进行继承 拷贝继承1 1.1.3. 模式3:混合(mix-in)1 ...
- javascript 模式(1)——代码复用
程序的开发离不开代码的复用,通过代码复用可以减少开发和维护成本,在谈及代码复用的时候,会首先想到继承性,但继承并不是解决代码复用的唯一方式,还有其他的复用模式比如对象组合.本节将会讲解多种继承模式以实 ...
随机推荐
- iOS常用的代码块整理
strong @property (nonatomic,strong) <#Class#> *<#object#>; weak @property (nonatomic,wea ...
- rest-framework之分页器
rest-framework之分页器 本文目录 一 简单分页(查看第n页,每页显示n条) 二 偏移分页(在第n个位置,向后查看n条数据) 三 CursorPagination(加密分页,只能看上一页和 ...
- 05 面向对象:构造方法&static&继承&方法 &final
构造方法及其重载: /* 构造方法格式特点 * a:方法名与类名相同(大小也要与类名一致) * b:没有返回值类型,连void都没有 * c:没有具体的返回值return; * 构造方法的重载 * 重 ...
- 实验吧—Web——WP之 FALSE
打开链接,点击源码按钮,我们开始分析源码: 在这源码中我们能看出 如果名字等于密码就输出:你的名字不能等于密码 如果名字的哈希值等于密码的哈希值,那么就会输出flag 这就意味着我们要上传两个值,值不 ...
- 高斯消元 o(n^3) 取摸和不取摸
#include<bits/stdc++.h> using namespace std; ; int a[MAXN][MAXN];//增广矩阵 int x[MAXN];//解集 bool ...
- $.each $.map $.filter 区别 Script
$('section.required').each(function () { var type = $(this).attr('data-type'); if (type == 'MULTIPLE ...
- 【BZOJ2594】【WC2006】水管局长
日……又被傻B错坑了一整天…… 原题: SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要 ...
- c# 自定义log4net过滤器
有时候为了实现自己想要的多个日志文件记录不同的内容,可能需要自定义log4net过滤器,比如我这里需要记录三个文件,这三个文件的内容又不能重复,多次尝试未果. 为了不更改任何现有日志代码的情况下,于是 ...
- 利用 httpmodule 强制所有页面使用同一基类
public class OMSPageChecker : IHttpModule { public void Dispose() { } public void Init(HttpApplicati ...
- 对《禁忌搜索(Tabu Search)算法及python实现》的修改
这个算法是在听北大人工智能mooc的时候,老师讲的一种局部搜索算法,可是举得例子不太明白.搜索网页后,发现<禁忌搜索(Tabu Search)算法及python实现>(https://bl ...