分享
 
 
 

多态与面向对象(二)

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

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

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

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

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

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

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

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

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

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

classOMOSFactory {

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;

}

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

OMOSFactory::instance();

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

OMOSFactory::instance()-createOMOSMutex();

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

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

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

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

[[The No.1 Picture.]]

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

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有