C++可扩展的编程模式

 注意:设计原则----尽量不要去修改基类内容,有新的东西要从派生类中去实现。层层派生。派生模式使得可扩展、

#ifndef WIN_32_TEST_H
#define WIN_32_TEST_H
#include <iostream>
#include <ctime>
#include <string>
using std::endl;
using std::cout;
using std::string;

//钟表的几种颜色
enum Color
{
red,
blue,
white,
black
};

//钟表的形状
enum Shape
{
square, //方形
circle //圆形
};

//抽象钟表基类。将钟表类通用方法,例如显示时间抽象出来,放在基类中。
class Clock
{
public:
inline string GetTime() //显示时间的方法通用,所以抽出来作为基类中方法
{
time(&now);
NT = localtime(&now);
int nHour = NT->tm_hour;
int nMinute = NT->tm_min;
int nSecond = NT->tm_sec;
char *pTemp = new char[24];
memset(pTemp, 0, 24);
itoa(nHour, pTemp, 10);
string sHour = pTemp; //转换Hour
memset(pTemp, 0, 24);
itoa(nMinute, pTemp, 10);
string sMinute = pTemp; //转换分钟
memset(pTemp, 0, 24);
itoa(nSecond, pTemp, 10);
string sSecond = pTemp; //转换秒数
string sTime = sHour + ":" + sMinute + ":" + sSecond;
if (pTemp)
{
delete [] pTemp;
pTemp = NULL;
}
return sTime;
}

//返回表的外观颜色
virtual int GetColor() = 0; //纯虚函数,抽象类不能实例化对象

private:
time_t now;
struct tm *NT;
};

//派生类---挂钟
class WallClock : public Clock
{
public:
int GetColor() //重写派生类的虚方法
{
return red;
}

//挂钟的形状,派生类自己的方法
int GetShape()
{
return square;
}
};

//派生类---闹钟
class AlarmClock : public Clock
{
public:
int GetColor()
{
return black;
}

//闹钟形状----闹钟类自己的方法
int GetShape()
{
return circle;
}
};

//后续闹钟有功能增加了,需要从AlarmClock类派生,而不是从Clock派生
class AlramClockExtend : public AlarmClock
{
public:
void Alarm() //添加了闹铃功能
{
cout<<"Alarm"<<endl;
}
};

#endif

时间: 2024-08-22 14:30:22

C++可扩展的编程模式的相关文章

对比.NET PetShop和Duwamish来探讨Ado.NET的数据库编程模式

ado|编程|数据|数据库   对比.NET PetShop和Duwamish来探讨Ado.NET的数据库编程模式 概述Ado.NET为我们提供了强大的数据库开发能力,它内置的多个对象为我们的数据库编程提供了不同的选择.但是在允许我们灵活选用的同时,许多初学者也很迷惑,我到底是应该使用DataReader还是应该使用DataAdapter?我只想读取一小部分数据,难道我一定要Fill满整个DataSet吗?为什么DataReader不能和RecordSet一样提供一个数据更新的方法?DataSe

为了支持AOP的编程模式,我为.NET Core写了一个轻量级的Interception框架[开源]

ASP.NET Core具有一个以ServiceCollection和ServiceProvider为核心的依赖注入框架,虽然这只是一个很轻量级的框架,但是在大部分情况下能够满足我们的需要.不过我觉得它最缺乏的是针对AOP的支持,虽然这个依赖注入框架提供了扩展点使我们可以很容易地实现与第三方框架的集成,但是我又不想"节外生枝",为此我们趁这个周末写了一个简单的Interception框架来解决这个问题.通过这个命名为Dora.Interception的框架,我们可以采用一种非常简单.直

分布式编程模式中的租约、事务和分布式事件机制

Jini技术面向网络及分布式计算的特性决定了Jini技术必然与传统的单机系统在许多方面有概念上和实际应用中的差别.如网络的延迟.失败,或者设备的突然撤出,将导致信息的无序和丢失:资源的获得.保存.维护和回收情况更为复杂:不同实体之间通讯和协调工作的可靠性及效率并不像单机系统中那样较为容易地获得保证.因而在 Jini 中以 Java 为基础加入了分布式编程模式,特别是引入了租约.分布式事务和分布式事件. 租约 租约的基本概念是资源只能被使用一段时间,这由租约的持有者(lease holder)和租

【译】Go语言编程模式

声明:本文为InfoQ中文站特供稿件,首发地址为:Go语言编程模式 在2016年伦敦举办的QCon大会上,Peter Bourgon做了<六年Go语言设计经验>的报告,重点探讨了在使用Go进行开发时的编程模式和反模式.在这里,我们将他给Go开发者的建议进行了简单的总结. GOPATH:将GOPATH/bin添加到"PATH"这个环境变量中,以便Go应用可以访问所需要的二进制文件.在绝大多数场景下,Bourgon建议使用全局唯一的GOPATH.有些开发者希望严格区分自己的代码

泛函编程(27)-泛函编程模式-Monad Transformer

  经过了一段时间的学习,我们了解了一系列泛函数据类型.我们知道,在所有编程语言中,数据类型是支持软件编程的基础.同样,泛函数据类型Foldable,Monoid,Functor,Applicative,Traversable,Monad也是我们将来进入实际泛函编程的必需.在前面对这些数据类型的探讨中我们发现: 1.Monoid的主要用途是在进行折叠(Foldable)算法时对可折叠结构内元素进行函数施用(function application). 2.Functor可以对任何高阶数据类型F[

Scalaz(10)- Monad:就是一种函数式编程模式-a design pattern

   Monad typeclass不是一种类型,而是一种程序设计模式(design pattern),是泛函编程中最重要的编程概念,因而很多行内人把FP又称为Monadic Programming.这其中透露的Monad重要性则不言而喻.Scalaz是通过Monad typeclass为数据运算的程序提供了一套规范的编程方式,如常见的for-comprehension.而不同类型的Monad实例则会支持不同的程序运算行为,如:Option Monad在运算中如果遇到None值则会中途退出:St

soap-基于SOAP和REST的ACE编程模式的访问

问题描述 基于SOAP和REST的ACE编程模式的访问 什么是对于基于SOAP和REST的Authority-Container-Entity (ACE) 编程模式的访问?

【C/C++学院】0817-递归汉诺塔 双层递归 /CPP结构体 /面向过程与面向对象的编程模式/类的常识共用体实现一个类的特征/QT应用于类以及类的常识

递归汉诺塔 双层递归 #include <iostream> void han(int n, char A, char B, char C) { static int num = 1; std::cout << "第" << num << "次"; num++; if (n<1) { return; } else { han(n - 1, A, C, B); std::cout << A <&l

MapReduce编程模式原理及其算法设计

MapReduce是一种编程模式,在很大程度上借鉴了函数式语言.它主要的思想是分而治之(divide and conquer).将一个大的问题切分成很多小的问题,然后在集群中的各个节点上执行,这既是Map过程.在Map过程结束之后,会有一个Ruduce的过程,这个过程即将所有的Map阶段产出的结果进行汇集. 上述过程可以说是一个显而易见的过程,所以说MapReduce是一个极其简单而有极其复杂的编程模式.说它简单是因为在程序员使用它编程解决实际问题时,他只要编写一个Mapper函数和一个Redu