C++类功能扩展预留五招
第一招虚函数
通过派生类来进行功能扩展是基本的面向对象的方式,这种方式大如下:
class base
{
public:
virtual ~base(){}
virtual void fun()
{
cout << "基本功能" << endl;
}
};
class derive:public base
{
public:
void fun()
{
cout << "扩展功能" << endl;
}
};
这种方式下,基类通过声明虚函数,让派生类来覆盖,最后通过多态来实现扩展功能。这种方式的最大的缺点是基类的编写者一般很难确定虚函数的功能究竟要实现到什么程度,如果有一天突然发现一个虚函数的功能要进行扩张(或收缩),那么所有从这个基类派生的类都要进行编译。这种方式的另一个缺憾是。功能的扩展不能在运行时设定。
第二招组合
通过组合方式来为类的功能扩展留下余地的方式,要比通过继承的方式在耦合方面要松的多。就是把上面的虚函数所要委托给一个其它的类。这种方式大体如下:
class action
{
public:
virtual void fun()
{
cout << "基本功能" << endl;
}
};
class exAction:public action
{
public:
virtual void fun()
{
cout << "扩展功能" << endl;
}
};
class app
{
public:
app():paction(NULL){}
virtual ~app(){}
virtual void fun()
{
if(paction)
paction->fun();
}
void setActoin( action* action_)
{
paction = action_;
}
private:
action* paction;
};
在这个例子中,类app把它的功能委托给了类action。这样一来,类app就和它的功能进行了解藕。解藕后的类app现在可以在运行时进行功能设定了。通过组合的方式虽然解藕了也能进行功能的运行时设定了。但却明显地不如第一种方式效率高。
第三招函数指针成员
通过函数指针成员方式,可以提高效率。这种方式大体如下:
class app
{
public:
app():pfun(NULL){}
virtual ~app(){}
typedef void(*FUN)();
void setFun(FUN fun_)
{
pfun = fun_;
}
virtual void fun()
{
if( pfun)
pfun();
}
private:
FUN pfun;
};
第四招成员模板函数
通过为类预留一个成员模板函数,而为类的使用者留下扩展的余地。这种方式简捷、干练。遗憾的是这种方式不能用在动态方面上。这种方式大体如下:
class app
{
public:
app(){}
virtual ~app(){}
template <class T>
void fun( T& t_)
{
cout << "基本功能" << endl;
}
};
template < >
void app::fun(int & t_)
{
cout << "扩展功能" << endl;
}
这种方式还能依偏特化的形式进行,具体请参考我的另一篇blog《让后门能够偏特化》。使用这种方式最奇妙的是声明一个模板构造函数来扩展类的构造功能。
第五招模板基类
上面的几种方式都是针对一个要进行开发的类为这个要开发的类留下扩展余地。那么能不能让要开发的类用来扩展任意的已开发好的类的功能呢?这就是第五招模板基类。这种方式大体如下:
template < class T>
class exApp:public T
{
public:
void fun()
{
cout << "扩展功能" << endl;
}
};
现在我们可以方便的把类exApp的功能添加到任意的其它的类上了。这种扩展方式的功能非常强悍,它甚至引出一个专门的编程方式:“基于策略的编程”。
详见《C++程序设计就思维》。
原文转自:http://blog.csdn.net/guanwl/article/details/2358073
原作者为 guanwl。请尊重原作者版权
C++类功能扩展预留五招的更多相关文章
- 利用Mixins扩展类功能
8.18 利用Mixins扩展类功能 - python3-cookbook 3.0.0 文档 https://python3-cookbook.readthedocs.io/zh_CN/latest/ ...
- [转]用GSON 五招之内搞定任何JSON数组
关于GSON的入门级使用,这里就不提了,如有需要可以看这篇博文 <Google Gson的使用方法,实现Json结构的相互转换> ,写的很好,通俗易懂. 我为什么写这篇文章呢?因为前几晚跟 ...
- [转] Android:用GSON 五招之内搞定任何JSON数组
[From] http://www.open-open.com/lib/view/open1472632967912.html 写在前面 关于GSON的入门级使用,这里就不提了,如有需要可以看这篇博文 ...
- 重学 Java 设计模式:实战装饰器模式(SSO单点登录功能扩展,增加拦截用户访问方法范围场景)
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 对于代码你有编程感觉吗 很多人写代码往往是没有编程感觉的,也就是除了可以把功能按照固 ...
- WPF自定义控件与样式(3)-TextBox & RichTextBox & PasswordBox样式、水印、Label标签、功能扩展
一.前言.预览 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要是对文本 ...
- IOS基础之 (十二) 类的扩展
对OC类的扩展总结如下,共有4个: 1.子类 subClass 作用:可以使用类的继承来增添父类的变量和方法. 写法:在.h文件中 @interface Student : Person 2.分类 C ...
- spring源码深度解析-2功能扩展
容器功能的扩展ApplicationContext用于扩展BeanFactory中现有的功能.究竟多出了哪些功能,进一步探索.写法上:BeanFactory bf = new XmlBeanFacto ...
- vs.net 2013 Saffolding功能扩展
vs.net 2013 Saffolding功能扩展 Asp.net mvc 5 CRUD代码自动生成工具 -Visual Studio.net2013 Saffolding功能扩展 上次做过一个&l ...
- Asp.net mvc 5 CRUD代码自动生成工具- vs.net 2013 Saffolding功能扩展
Asp.net mvc 5 CRUD代码自动生成工具 -Visual Studio.net2013 Saffolding功能扩展 上次做过一个<Asp.net webform scaffoldi ...
随机推荐
- linux centos6.5 ftp网页vsftpd配置
安装命令centos下 yum install vsftpd 出现“Complete!”时意味着安装完成.Linux中,系统对于大小写严格区分,比如abc和ABC是完全不相同的字符,要特别注意.配置V ...
- ganglia安装简记
首先需要安装EPEL的源. yum install -y ganglia.x86_64 ganglia-gmetad.x86_64 ganglia-web.x86_64 ganglia-gmond.x ...
- SSH 整合及注意事项
Spring 整合 hibernate 配置 1. spring 配置管理datasource 及 sessionFactory 1) 引入相关jdbc配置文件. <context:proper ...
- MMORPG大型游戏设计与开发(构架)
游戏整体是以经典的武侠世界/天龙八部作为基本的一种设计模式,大致分为以下几个部分. 游戏的简单的一次处理流程如下,不过有些凌乱,还有待完善. 程序设计方面,服务器基本上分为数据处理.日志.网络等模块, ...
- WPF使用后台C#代码创建Grid
笔者刚刚接触WPF,菜鸟一枚,在做一个练手程序时遇到这样一个需求,创建一个新的Grid并将其添加至一个ListView中,要求Grid及其子元素应按一定顺序给Name属性赋值,直接使用XAML创建的话 ...
- luogu1003铺地毯[noip2011 提高组 Day1 T1]
题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于 ...
- understand一些功能
功能 支持分析的语言 统计总的代码数据 统计单个文件的数据 分析代码复杂度 分析代码格式 文件的依赖关系 文件夹依赖关系 文件夹包含关系.代码量 understand提供了很多图表,同时它可以根据源码 ...
- android edittext 去边框 去下划线
EditText的background属性设置为@null就搞定了:android:background="@null"style属性倒是可加可不加 附原文:@SlumberMac ...
- Android平台的一些常用命令
一.Android常见目录结构 1. apk文件在/data/app目录下 2. /data/data/[package.name]目录,存放程序数据缓存等等 3.SD卡安装方式的,则在/mnt/ ...
- PAT 1029. 旧键盘(20)
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出肯定坏掉的那些键. 输入格式: 输入在2行中分别给出应该输入的文字.以及实际 ...