我们知道 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 里面没有这种功能
最新评论