如何扩展库类的功能?

时间:2012-05-24 15:52:00

标签: c++ oop unicode mfc polymorphism

问题

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

我的解决方案

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

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);


};

现在我希望在doc的文件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 );
    }
}

CArchiveA & ar_a ( ar );以上的第一行是编译器错误。

问题

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

我发现这是一个从给定库扩展基类功能的有趣案例研究。在寻找面向对象设计时,我也希望在解决方案中探索这个方面。我有一些想法,但我想先听你的。那个意义上的问题是什么是解决像这样的问题的最佳方法,当(比如)库类有点缺乏功能?感谢。

1 个答案:

答案 0 :(得分:1)

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

通过公开继承,您说CArchiveA是一个CArchive

这种关系不是可交换的。它类似于亲子关系。因此,CArchive对象不是 CArchiveA对象,并且您不能使用CArchiveA引用指向CArchive对象。

更好的选择是让CArchiveA类成为CArchive对象的包装器,并包含它而不是继承它。您可以为CArchiveA定义一个构造函数,该构造函数接收CArchive对象或引用,并保留对它的引用,然后定义您的ReadString/WriteString方法以执行您想要的操作。

如果CArchive实现了一些抽象接口,您可能也希望从中导出CArchiveA。但如果没有,你可能不想为此使用继承。