gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:00:22 25 4
gpt4 key购买 nike

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

一切的基础接口(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com