c++ - 使用虚拟方法设计类

标签 c++ oop

如何使用类和类型尽可能少的代码来解决这样的问题? 这是我的东西

一切的基础接口(interface)

    class IWindow
    {
    public: 
        virtual void Refresh() = 0;
// another 100 virtual methods
// ...
    };

这个接口(interface)在不知 Prop 体实现的库中使用。

下面是具体实现的一个版本

    class ConcreteWindow : public IWindow
    {
    public:
        void Refresh() override {}
/// the other 100 overridden methods 
    };

现在我们有了另一个接口(interface),它添加了一些额外的方法并在该库中使用。

class IDBDetail : public IWindow
{
public:
    virtual void DoDetail() = 0;

};

这是主要问题,当我们为它创建具体实现时

class IGDBDetailWrapper : public IDBDetail, public ConcreteWindow
{
public :
    void DoDetail() {}
};

当然,具体类 IGDBDetailWrapper 也是抽象的,因为它没有实现那 100 个方法,但我不想那样做,我只想重用 中的实现code>ConcreteWindow,它们都使用相同的窗口句柄,但这当然不会编译。

我可以将 ConcreteWindow 中的那 100 个方法复制/粘贴到 IGDBDetailWrapper 中,但这太过分了,因为我可能还有另外 10 个这样的新接口(interface)和具体实现。

我可以在这里使用什么其他模式来帮助解决问题而不是一次又一次地重新实现这 100 个方法?

谢谢

最佳答案

您的设计遇到了diamond problem .

Now we have another interface that adds some additional methods and also used inside that library.

 class IDBDetail : public IWindow { 
  public:
     virtual void DoDetail() = 0;

};

从您的 IDBDetail 接口(interface)的描述来看,IDBDetail 不应该继承自 IWindow。如果只是添加附加功能,那么 IDBDetail 不需要是 IWindow。它只需要了解 IWindow。例如,为了让猴子做一些特别的事情,训练者不必是猴子。

Decorator pattern可能是你要找的。

关于c++ - 使用虚拟方法设计类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37045634/

相关文章:

c# - 如何满足既可以为 null 也可以为空的对象

类似类的 C++ 类模板

c++ - 使用 ReadDirectoryChangesW C++ 重命名文件夹后获取旧名称和新名称

c++ - 从 char* 创建 UTF-16 字符串

java - 如何使用设计模式实现最便宜的酒店查找器?

c# - 在 C# 中实现 DDD 实体类

Python覆盖没有setter的getter

c++ - GCC C++14/17 成员函数指针模板参数的区别

c++ - 结构段错误的结构

c++ - 为什么 C++ 类需要在类范围之外定义静态字段(数据成员)?