如何扩展库类的功能?

问题</强>

我使用Unicode编译我的项目,但我需要CMyDoc :: Serialize()函数来读取/写入ASCII文件(思考字符串)。问题是,一旦在Unicode中,CArchive类自动读/写Unicode中的所有字符串以及我不想要的。

我的解决方案

我的解决方案是从支持ASCII字符串的 CArchive 派生自己的类 CArchiveA 。这是我的班级定义。

class CArchiveA : public CArchive
{

public:
    CArchiveA(CFile* pFile,
                UINT nMode,
                int nBufSize = 4096,
                void* lpBuf = NULL);

    CArchiveA( CArchive & ar );

    virtual ~CArchiveA();

    BOOL ReadStringA(CStringA& rString);
    LPSTR ReadStringA(_Out_z_cap_(nMax+1) LPSTR lpsz, _In_ UINT nMax);

    void WriteStringA(LPCSTR lpsz);


};

现在我希望在文档的 Serialize 函数中做这样的事情。

void CTestDoc::Serialize(CArchive& ar)
{
    CArchiveA & ar_a ( ar );

   //text is of type CStringA

    if (ar.IsStoring())
    {
       //TODO: add storing code here
        ar_a.WriteStringA( text );
    }
    else
    {
       //TODO: add loading code here

        ar_a.ReadStringA( text );
    }
}

But the first line above CArchiveA & ar_a ( ar ); is compiler error.

问题</强>

也许我今天感觉生锈了,但是如何将 CArchive 转换为我自己的派生类 CArchiveA ,以便我可以使用它?如果我不是从 CArchive 派生,而是编写可接受 CArchive 作为第一个参数并写入ASCII字符串的帮助函数,那么它会更好吗?

我发现这是一个有趣的案例研究,扩展了给定库中基类的功能。我很想在解决方案中探索这方面,同时寻找面向对象的设计。我有我的想法,但首先想听你的想法。从这个意义上说,问题的解决方式是什么时候解决这样的问题的最好方法是什么时候(比如说)库类的功能降低了?谢谢。

0
额外 编辑
意见: 1

1 答案

我认为遏制是比这项工作继承更好的工具。

通过公共继承,你说 CArchiveA 是-a CArchive

这种关系是不可交换的。这与亲子关系类似。因此,一个 CArchive 对象不是一个 CArchiveA 对象,您不能使用 CArchiveA 引用来指向到一个 CArchive 对象。

一个更好的选择是使你的 CArchiveA 类成为 CArchive 对象的包装器,并且包含它而不是继承它。您可以为 CArchiveA 定义一个构造函数,该构造函数接收 CArchive 对象或引用,并保存对其的引用,然后定义您的 ReadString/WriteString 方法来做你想做的。

如果 CArchive 实现了一些抽象接口,那么您也可以从中派生 CArchiveA 。但是,如果没有,你可能不希望为此使用继承。

0
额外
这是一个好方法。当我尝试`CTestDoc :: Serialize(CArchiveA&ar)'时,函数将不再被框架调用,因此这表示 不是 CArchiveA
额外 作者 zar,