知识大全 多态与面向对象(一)
Posted
函数
篇首语:骏马是跑出来的,强兵是打出来的。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 多态与面向对象(一)相关的知识,希望对你有一定的参考价值。
不管时光如何流逝 应该说每个人对他职业生涯的第一次面试都是记忆犹新 不是吗? 经过前两轮的筛选 我推开那扇门 小心翼翼地坐在Andy面前 我应聘的职位是C++程序员 坦率的讲 我有一些紧张 您知道的 一个找不到工作的应届大学生 生活是如何地充满压力 能告诉我什么是OO吗? Andy一开口就是这样一句 我有预感 他将主要考察我在面向对象方面的编程能力 我知道C++支持数种不同的程序设计风格 包括面向过程的编程风格(Procedural Programming) 泛型编程风格(Generic Programming) 基于对象的编程风格(Object base Programming)和面向对象的编程风格(Object oriented Programming) 可是什么是OO呢?具体概念 我还真的不大清楚 分析问题时 我们常常会把事物看作一个一个的对象 把具有相同特征的对象看作一个类 我想他是不是在期待这样的答案呢 那你对OB又作何解释呢? Andy面无表情 对呀 所谓OB 就是被称作ADT(Abstract Data Template)的程序设计风格 我刚刚所说的不也被OB所支持吗?一直以为自己在使用面向对象编程技术 谁知道 哎 真是惭愧啊 是的 应该说OO留给我印象最深的还是继承和多态 现在我只能尽量回想我曾参与过的少得可怜的项目以寻求答案 几乎每个人都同意继承和多态是OO概念 可是据我所知 真正理解这两个概念的却不多 时间有限 我们就谈谈多态 你知道C++以哪些方法支持多态吗? 显然他不想在我身上花太多时间 这个问题对于我还是不难回答的 例如有以下继承体系 其中rotate是一个虚拟函数 C++ 以三种方法支持多态 其一 经由一组隐含的转化操作 如把一个派生类指针转化为一个指向其公有基类类型的指针 shape *ps = new circle(); 其二 经由虚拟机制 如 ps >rotate(); 其三 经由dynamic_cast和typeid运算符 如 if (circle *pc = dynamic_cast (ps)) 多态的主要用途是经由一个共同的接口来影响类型的封装 这个接口通常被定义在一个抽象的base class中 这个接口是以virtual function机制引发的 它可以在执行期根据object的真正类型解析处到底是哪一个函数实体被调用 趁热打铁 我敢肯定如果还不能趁此机多说几句的话 那将是前功尽弃 如果我写下这样的代码又将怎样呢? Andy飞快地在一张纸片上写下 circle p; shape s(p); s rotate(); 以一派生类对象为初值初始化一个基类对象!这是我的第一反应 这会发生所谓的对象切割 同时多态不再呈现 虽然我敢肯定我所说的话语 可我总感觉Andy另有它意 为什么多态不再呈现? 他的眼神流露出一丝疑问 因为多态的特性只有在使用pointer或reference时才能发挥 我毫不犹豫的回答 好吧 请你讲讲曾参与过的设计 Andy似乎已经达到目的 后来我才知道 C++通过class的pointer和reference来支持多态 这种程序设计风格就是所谓的OO 我想起曾经参与的一个项目 我的主要任务是通过串口来控制一种叫做云台的外设 其实就是根据通信协议将客户请求翻译成相应的字符串 然后通过串口发送出去 看起来很简单 是吗?不过 为了争取更大的市场 我们必须尽可能多的支持不同厂商提供的不同协议 并且能够在未来方便地加入当前尚未支持的协议 当时的设计就好像这样子 class CPtzHal public: CPtzHal(CSerial *pSerial CProtocol *pProtocol); void sendCommand(int mand); private: CSerial *m_pSerial; CProtocol *m_pProtocol; ; 成员函数sendCommand的定义如下 void CPtzHal::sendCommand(int mand) if(m_pSerial != NULL && m_pProtocol != NULL) m_pSerial >send(m_pProtocol >getCommandString(mand)); 您看 我们使用CPtzHal 来接受并处理用户的请求 CProtocol 就是我们的协议类 通过其成员函数getCommandString 得到指定的请求ID所对应的应该发往串口的字串 CSerial实际上是串口类 而CSerial::send的作用当然是把指定的字串发送出去 那么 你是怎么保证方便的添加新协议呢? Andy轻轻移了移身体 如您所知 CProtocol理所当然是一个基类 而且我把它设计成一个抽象基类 所有的具体的协议类都将从它派生 我缓缓说道 同时写下以下代码 class CProtocol public: virtual ~CProtocol(); virtual string getCommandString(int) = ; ; 您看 因为是一个基类 其析构函数当然要声明为virtual…… 等等 既然析构函数什么都不做 为什么要给它一个空的函数体? Andy开始试探我 正如我刚才所说 我是有义务要声明它们的 本来我也不想给出实现 可是即使我同意 编译器也不会答应啊 嗯 不错 Andy的首肯令我颇有些难为情 至于每一个具体的协议类 都必须实现在CProtocol中声明的那些纯虚函数(pure virtual function) 我飞快地写出以下代码 class CIntelProtocol : public CProtocol public: string getCommandString(int mand); ; string CIntelProtocol::getCommandString(int mand) // 返回相应的字串 您看 CIntelProtocol正是封装了英特尔的协议 当有新的协议加进来的时候 做法就如同以上一般 从CProtocol派生出一个新的协议类 从Andy的表情可以看出 他还算满意 作为协议类的客户 CPtzHal并不需要知道这个具体协议到底是英特尔的还是三星的 说不准它是将来某个别的厂商所提供的 可是这有什么关系呢?不管这点如何改变 CPtzHal压根就不用变 这 正是多态所带来的好处 我和Andy的对话就这样结束了吗?不 还没有 这正如我要跟你讲的有关OOP的故事 还将继续 cha138/Article/program/Java/hx/201311/26229 相关参考
知识大全 面向对象思想之 -- 继承以及多态
在OOP简介:理解类和对象这篇文章中我们讨论了继承和多态性的好处我们还粗略的学习了如何扩展基类定义子类继承基类中合适的行为和属性而重载那些并不适合的行为和属性这种方式能够削减代码宏余以及错误的堆积
知识大全 面向对象的一些术语精解
多态一个对象变量可以引用多种实际类型的现象叫做多态(polymorphism)在java和c++语言中指的是可以用子类对象赋给父类对象说道多态就要说说覆蓋(overriding)覆蓋实际上指在同一
知识大全 面向对象思想之 -- 限制对象属性的访问
虽然Java只支持从一个父类继承但它使用接口的方式支持多重继承 接口实现了多态使得我们能够给与对象不同特性以满足不同的需要 你可以使用多态机制让完成相似功能的不同的方法拥有相同的名字但是拥有不
知识大全 面向对象三大特性之封装
java学习已经到了最核心的章节面向对象的三大特性封装继承和多态接下来会写多篇博文(数目不定请关注近期博客吧!午饭们!)来总结这里面的每一个细节小可很希望每一篇文章的阐述会给你带来一点启发小可也是
知识大全 面向对象思想之 -- 理解类和对象
上一次在使用Java开始面向对象的编程这篇文章中我们学习了一个编程语言要真正成为面向对象的它应该支持信息隐藏/封装多态继承和动态绑定另外我们知道了Java完全支持这些功能而且知道了因为Java是一
知识大全 Java运行时多态性的实现
Java运行时多态性的实现 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 运行时多态性是面向对象
知识大全 数据库与面向对象是冤家
面向对象和数据库之间存在着矛盾这正是我们学习了面向对象理论之后信心百倍地要去做项目时突然发现有很多问题的原因…… 话说当年面向对象和数据库刚出道的时候曾经引发过惊天动地的大讨论(当然这里说的是关
知识大全 JS中的prototype与面向对象
JS中的prototype与面向对象 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!<scri
知识大全 Delphi面向对象的编程方法(一)
Delphi面向对象的编程方法(一) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Delphi
知识大全 面向对象建模与数据库建模的比较
我们知道一个软件从无到有需要经过如下几个阶段分析设计编程调试部署和运行 编程阶段我们通常使用Java/NET这样面向对象语言工具可以带来很多设计上的好处但是也存在一个奇怪的现象很多程序员虽然在使