我正在尝试向现有库中添加新功能。我需要将新数据添加到类层次结构中,以便根类可以使用它的访问器。任何人都应该能够获得只有子类才能设置的数据(即公共(public) getter 和 protected setter )。

为了保持向后兼容性,我知道我不能执行以下任何操作(列表仅包括与我的问题有关的操作):

  • 添加或删除虚拟函数
  • 添加或删除成员变量
  • 更改现有成员变量
  • 的类型
  • 更改现有函数
  • 的签名

    我可以想到两种将数据添加到层次结构的方法:向根类添加新的成员变量或添加纯虚拟访问器函数(以便可以将数据存储在子类中)。但是,要保持向后兼容,我不能做任何一个。

    该库广泛使用pimpl惯用语,但是不幸的是,我必须修改的根类确实使用而不是来使用此惯用语。但是,子类使用此惯用语。

    现在,我能想到的唯一解决方案是使用静态哈希映射模拟成员变量。因此,我可以创建一个静态哈希映射,将此新成员存储到其中,并为其实现静态访问​​器。像这样的东西(在伪C++中):
    class NewData {...};
    
    class BaseClass
    {
    protected:
        static setNewData(BaseClass* instance, NewData* data)
        {
            m_mapNewData[instance] = data;
        }
    
        static NewData* getNewData(BaseClass* instance)
        {
            return m_mapNewData[instance];
        }
    private:
        static HashMap<BaseClass*, NewData*> m_mapNewData;
    };
    
    class DerivedClass : public BaseClass
    {
        void doSomething()
        {
            BaseClass::setNewData(this, new NewData());
        }
    };
    
    class Outside
    {
       void doActions(BaseClass* action)
       {
           NewData* data = BaseClass::getNewData(action);
           ...
       }
    };
    

    现在,尽管此解决方案可能有效,但我发现它非常丑陋(当然,我也可以添加非静态访问器函数,但这不会消除丑陋感)。

    还有其他解决方案吗?

    谢谢你。

    最佳答案

    您可以使用decorator pattern。装饰者可以公开新的数据元素,而无需更改现有的类。如果客户通过工厂获得其对象,这将是最好的选择,因为这样您就可以透明地添加装饰器。

    10-07 23:36