多态与面向对象(下)

原创 2004年05月07日 15:53:00

多态与面向对象(下)

          两个星期后,Andy旁边的隔间成了我的领地。我的工作、我的学习、还有我的午休,都在这里。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

Andy,这就是Rhapsody的几个OS基类吗?它们并不像想象中的那么难耶。”

Rhapsody是我们正在使用的一个集建模与代码产生功能于一身的工具。它有一个很突出的特点,那就是支持很多OS平台。噢,我的意思并不是说它像Java一样,有着“write once, run anywhere”的本领,事实上,您可以在Rhapsody中选择不同的目标平台,它将选择对应的编译器、连接器以输出您想要的二进制程序。

从代码层面来看,Rhapsody提供了一组OS抽象基类,也就是所谓的OSALOS Abstract Layer),比如OMOSThread意味着一个线程、OMOSMessageQueue意味着一个消息队列、OMOSMutex意味着一个互斥量。Rhapsody的应用程序框架正是通过操纵这些抽象基类的指针,达到与OS交流的目的。

对于每个具体的目标平台,Rhapsody需要从这组抽象类派生出一组具体类,并以相应平台上的API来实现基类中所声明的每一个接口。当然,如果Rhapsody不支持您想要的OS平台,而您的应用程序又偏偏想要运行于其上的话,很显然,编码的事情就得您来做。

或许您会同我一样,认为它真的是不过如此。可是,请听听这个响亮的声音:

“是吗?年轻人,请保持冷静。”不用说,这就是Andy

看来另有玄机。我的目光立即开始在一个叫os.h的文件中搜索,因为所有的os抽象基类就定义在这里。忽然我发现其中竟然定义有一个叫OMOSFactory的类!

Factory?什么嘛,学习操作系统时,老师怎没讲这个东西?”我开始自言自语。

“什么?连这个你都不知道啊……Andy探出头来,一脸的狐疑。

这分明是激将法,我知道他想尽快将我训练成OO杀手,可也用不着这么心急嘛。继续往下看,我发现OMOSFactory的定义如下:

class  OMOSFactory {

public:

         static OMOSFactory* instance();

virtual OMOSMessageQueue* createOMOSMessageQueue(OMBoolean shouldGrow = TRUE, const long messageQueueSize = OMOSThread::DefaultMessageQueueSize) = 0;

         virtual OMOSThread* createOMOSThread(void tfunc(void *), void *param,

                   const char* const threadName = NULL,

                   const long stackSize = OMOSThread::DefaultStackSize) = 0;

         virtual OMOSMutex* createOMOSMutex() = 0;

         // 其它成员函数的声明

         ......

};

原来是个名副其实的对象工厂呀,也就是说,将来所有的OS对象都将通过它来创建!由于它是个抽象类,很显然它需要被派生,并由具体的派生类来完成真正的OS对象创建工作。可是,我忽然隐约觉得有些不对。

“既然是个基类,为什么它没有声明一个为virtual析构函数呢?”我嘀咕道。

“你怎么老是这么多的为什么,难道当初我就是看中了你提问题的能力?”Andy总不忘给我些刺激。

“除非这个类的设计者确定不会有人企图透过一个pointer-to-base去删除一个derived object。”

“既然如此,那你说说客户如何来使用这个类?”Andy穷追不舍。

对啊,这可是个抽象类,这就是说不可为它定义任何对象。可是现在又竟然不能动态创建一个派生类对象,同时将其地址赋值给一个类型为OMOSFactory *的指针,这该怎么办呢?

突然,我发现了static OMOSFactory* instance();这么一句,马上想到去看看这个函数的定义。在文件VxOS.cpp我找到了它:

OMOSFactory* OMOSFactory::instance()

{

         static VxOSFactory theFactory;

         return &theFactory;

}

同样,在文件NtOS.cpp中同样有它:

OMOSFactory* OMOSFactory::instance(){

         static NTOSFactory theFactory;

         return &theFactory;

}

真相大白!不用说,VxOSFactoryNTOSFactory是派生自OMOSFactory。事实上,针对VxWorksOS类和工厂的定义及实现正是在VxOS.hVxOS.cpp两个文件中;而针对Win32平台的OS类和工厂的定义及实现正是在NtOS.hNtOS.cpp两个文件中。很显然,当客户写下

OMOSFactory::instance();

时,他将获得一个类型为OMOSFactory *的指针,这个指针指向一个具体的派生类对象;而且,由于这个对象是被声明为static,这表明在程序生命期间,不管上面一句被写过多少次,只会有一个工厂对象被产生。无论何时,当客户想要获取一个互斥量时,他都只需这么写:

OMOSFactory::instance()->createOMOSMutex();

而不用管他的程序到底想运行于哪个OS平台之上。

“真是个不错的idea啊!”我发出由衷的感叹。

“事实上,OMOSFactory实现了一个叫SINGLETON的设计模式。”不知何时,Andy竟然出现在我的身后,脸上似乎还带着一丝笑意,“当你保证某个类仅有一个实例,并提供一个访问它的全局访问点。你就可以使用这个模式。”

“是的,您说的很对。不过我总觉得,多态的威力在这里真是发挥得淋漓尽致啊。”

“其实这里还有一个被称作ABSTRACT FACTORY的设计模式,或许这个能给你一些启示。”说着,Andy不知从何处拿出一张小图片[1]

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />CSDN_Dev_Image_2004-5-71020290.png

“你看,不管是OS对象,还是创建这些对象的工厂,客户只需与它们的抽象基类打交道。而且,要正确运用这两种模式,客户还应该使用这些基类的指针。事实上,面对以上这这样一个SINGLETON,除了这么做,你别无选择。”Andy笑了笑,转身离去。

2002年12月

参考书籍:

1.   Stanley B.Lippman.深度探索C++对象模型

2.   Scott Meyers. Effective C++

3.   Gang of Four. 设计模式



[1] 该图片出自名著《Design Patterns Elements of Reusable Object-Oriented Software》。

【Python学习笔记】面向对象编程:继承和多态

【根据廖雪峰python教程整理】 一、继承 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的...
  • Junkichan
  • Junkichan
  • 2016年07月11日 15:14
  • 815

面向对象编程的几个关键概念继承、多态、组合

一、继承、接口与多态的相关问题:1、 继承的作用?好处?坏处?继承:通过继承实现代码复用。Java中所有的类都是通过直接或间接地继程java.lang.Object类得到的。继承而得到的类称为子类,被...
  • u010159842
  • u010159842
  • 2015年06月17日 22:21
  • 1238

运行时的多态与多重继承

Java中每一步操作,操作数据的类型必须合法。父类有的方法子类都有,凡是能够使用父类生成对象的地方,都可以使用子类生成对象。 举一个例子: package java6; public c...
  • ldld1717
  • ldld1717
  • 2016年05月14日 09:42
  • 286

面向对象_多态的好处

/* 多态的好处: A:提高了代码的维护性(继承保证) B:提高了代码的扩展性(由多态保证) 猫狗案例代码 */ class Animal{ public void eat(){ ...
  • L1585931143
  • L1585931143
  • 2016年10月05日 20:38
  • 704

C#——面向对象之多态

之前在学习java时,就碰到过这个问题,当时一知半解,最近在巩固C#的知识,遇到这个问题,希望本次彻底搞清楚。                                            ...
  • u012155427
  • u012155427
  • 2015年01月22日 19:39
  • 324

面向对象编程三大特性------封装、继承、多态

本文是对面向对象编程三大特性(封装、继承、多态)的一个学习总结。 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只...
  • jianyuerensheng
  • jianyuerensheng
  • 2016年06月07日 11:41
  • 8808

面向对象的六大原则之 —— 里氏替换原则

学习了何红辉、关爱民写的《Android设计模式》,对于面向对象的六大原则有进一步的理解,特此根据自己的理解记录总结一下 什么是里氏替换原则 面向对象的语言有三大特性:封装、继承、多态,里氏替换原则就...
  • asd2603934
  • asd2603934
  • 2016年03月01日 17:13
  • 1978

面向对象_按照多态前提给出代码体现

/* 多态:同一个对象(事物),在不同的时刻体现出来不同的状态。 举例: 猫是猫,猫是动物。 水(液体,固体,气态) 多态的前提: A:要有继承关系 B:要有方法重写 ...
  • L1585931143
  • L1585931143
  • 2016年10月05日 19:00
  • 289

php面向对象(OOP)—多态

多态是除封装和继承之外的另一个面象对象的三大特性之一,我个人看来PHP中虽然可以实现多态,但和c++还有Java这些面向对象的语言相比,多 态性并不是那么突出,因为PHP本身就是一种弱类型的语言,不存...
  • guoshaoqing001
  • guoshaoqing001
  • 2015年06月05日 15:00
  • 1528

面向对象三大特性之一 多态

首先,我们看一下百科的解释:多态(Polymorphism)按字面的意思就是"多种状态"。在面向对象语言中,接口的多种不同的实现方式即为多态。通俗的讲,就是同一个东西表现出多种状态,在面向对象的描述中...
  • lizhidefengzi
  • lizhidefengzi
  • 2017年03月11日 01:28
  • 340
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多态与面向对象(下)
举报原因:
原因补充:

(最多只允许输入30个字)