二级c语言上机模拟:在C语言里进行面向对象设计--模拟运行时识别

面向对象个特性是运行时识别当然如果你系统设计足够完美也用不到什么运行时识别但是有时使用下运行是识别能够是设计简化不少言归正传本文就是在前文基础上再研究如何使用 C 来进行运行时识别



我们知道 C实际上不是和对象绑定而是和类绑定也就是说个类个虚而不是个对象个虚所以如果个类较多时像前文那样定义接口:

struct IStream

{

void (*write)(IStream* pStream, char* pstr);

void(*read)(IStream* pStream, char buf, ssize_t size);

void (*flush)(IStream* pStream);



};

就会很浪费每个对象都有 (struct IStream) 这么大但是我们知道表是和类绑定而不是和对象绑定那么我们可以改进这个设计

struct IStreamClass

{

void (*write)(IStream* pStream, char* pstr);

void(*read)(IStream* pStream, char buf, ssize_t size);

void (*flush)(IStream* pStream);



};



基类定义改为:

struct IStream{

{

struct IStreamClass* vtbl;

}



如果需要实现个 FileStream 可以定义个具体类

struct FileStream

{

struct IStream base;

FILE* f;

}

FileStreamClass 可以使用个全局变量来定义:

extern struct IStreamClass _FileStream;

这个虚表是和类绑定所以有了它我们还可以增加运行时识别功能!

isFileStream(struct IStream* pStream){

pStream->vtbl _FileStream;

}



这样设计还能够增加集成层次比如 FileStream 本身又定义了个虚 vFunc 个类 AFileStream 继承自 FileStream 则可以在 FileStream.h 中增加这样定义:

***FileStream.h***

struct FileStreamClass{

struct IStream stream_;

void (*vFunc);

} ;

extern FileStreamClass _FileStream;



***FileStream.c***

FileStreamClass _FileStream = {

{

FileStream_write,

FileStream_read,

FileStream_flush



},

FileStream_vFunc

};



AFileStream 定义为下面这样

***AFileStream.h***

Struct AFileStream{

struct FileStreamClass* vtbl;



};

extern FileStreamClass _AFileStream;

AFileStream.c 内容就不用写了

这样以来你仍然可以用 FileStream->vtbl 当做 struct IStream 使用

这个运行时识别设计不支持动态创建功能 C 动态创建功能 MFC 设计就算是很好但是那个需要构造自动功能 C 里面没有这种功能

Tags:  c语言 二级c语言模拟软件 c语言上机模拟 二级c语言上机模拟

延伸阅读

最新评论

发表评论