您的位置:首页 > 编程语言 > C语言/C++

开篇之作 关于c++中多个基类有相同的方法的解决办法

2006-11-08 16:55 381 查看
blog开了有很长时间了,但是一直没有写。刚刚完成一个项目,期间遇到一些技术细节,借此话题开博。

具体的环境是这样的:我要写一个不同文件格式的文本内容萃取的组件,并把萃取到的内容写入流(IOutputStream)。为此我实现几个标准的流的COM组件,包括标准内存流,标准文件流。这些组件都导出IInputStream和IOutputStream这2个接口,定义如下。不同于Microsoft的IStream接口,这2个接口他们的流指针是相互独立的,所以对于Seek的实现就出现了问题,因为为了保持一致性,所以就不能重命名Seek方法。一个对象中导出具有2个相同方法的接口,而且他们的方法作用分别不同,那么怎么实现才可以不出现二义现象?通过实现和分析,采取了如下的定义方式解决了这个问题,同时也保证了2个接口高度的一致性。

通过以下的示例,我们解决了这样的问题。


示例:


class IInterface1




...{


public:


HRESULT Seek( ) = 0;


};




class IInterface2




...{


public:


HRESULT Seek() = 0 ;


};




class Object : public IInterface1, public IInterface2




...{


public:




HRESULT IInterface1::Seek()...{ return Interface1Seek();} //注意必须是内联的,否则会出现问题




HRESULT IInterface2::Seek()...{ return Interface2Seek();}


private:


HRESULT Interface1Seek();


HRESULT Interface2Seek();


}




mport "oaidl.idl";


import "ocidl.idl";


import "unknwn.idl";




typedef


[


v1_enum


]


enum




...{


STREAM_BEGIN = 0,


STREAM_CUR,


STREAM_END


}START_POS;




[


object,


local,


uuid(9B679759-51E8-4b67-84AD-CBFEB8FE5FA3),


helpstring("IBaseStream Interface"),


pointer_default( unique )


]


interface IBaseStream : IUnknown




...{






/**//*


@short:设置流的大小,如果流已经存在并长度为oldsize,那么新的流将被复制已有的流的min( oldsize, newsize )个字节


同时设置相应的流的指针,到最靠近他们的大小


@return:


S_OK成功, 或者一个错误的HRESULT返回


*/


HRESULT SetSize( [in] long newSize );






/**//*


@short:废弃已写入的内容


@return:


S_OK表示成功,否则表示失败


*/


HRESULT Discard( );








/**//*


@short:


从指定的位置平移offset个字节,并返回新的位置


@return:


S_OK表示成功,STG_E_INVALIDPOINTER表示newpos是无效的指针, STG_E_INVALIDFUNCTION表示eStartPos是无效的值


STREAM_E_SEEK_OFFSET_OVER表示offset太大,以至超过了流的空间


*/


HRESULT Seek( [in] long offset, [in] START_POS eStartPos, [out,retval]long *newpos );






/**//*


@short:


取得流的大小


@return:


S_OK表示成功,否则表示失败


*/


HRESULT GetStreamSize( [out,retval] long *size );






/**//*


@short:


取得流中数据的数量


@return:


S_OK表示成功,否则表示失败


*/


HRESULT GetDataBytes( [out,retval] long *len );




};




[


object,


local,


uuid(5B4CBCCD-0683-43e1-A8CB-FF8A7B8D142A),


helpstring("IInputStream Interface"),


pointer_default( unique )


]


interface IInputStream : IBaseStream




...{






/**//*


@short:从流中读取数据,并返回实际读去的数量


*/


HRESULT Read( [in,out]long *len, [out] byte *szBuffer );






};


//输出流


[


object,


local,


uuid(80FD37A0-BD90-434a-8EDC-30B9B3252FA6),


pointer_default( unique )


]


interface IOutputStream : IBaseStream




...{




/**//*


@short:写入字节到流中


@return:


S_OK表示成功,E_POINTER表示传入的指针有错, E_INVALIDARG表示参数值有错


STREAM_E_NO_SPACE表示流没有多余的空间


STREAM_E_OUT_OF_MEMORY分配内存失败


*/


HRESULT Write( [in]const byte *bStream, [in,out] long *size );






};

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐