【发布时间】:2016-05-05 08:12:26
【问题描述】:
如何使用类解决此类问题并尽可能少地键入代码? 这是我所拥有的
一切的基本接口
class IWindow
{
public:
virtual void Refresh() = 0;
// another 100 virtual methods
// ...
};
这个接口在一个不知道具体实现的库中使用。
这里是具体实现的一个版本
class ConcreteWindow : public IWindow
{
public:
void Refresh() override {}
/// the other 100 overridden methods
};
现在我们有了另一个接口,它添加了一些额外的方法并在该库中使用。
class IDBDetail : public IWindow
{
public:
virtual void DoDetail() = 0;
};
这是主要问题,当我们为其创建具体实现时
class IGDBDetailWrapper : public IDBDetail, public ConcreteWindow
{
public :
void DoDetail() {}
};
当然,具体类IGDBDetailWrapper 也是抽象类,因为它没有实现这 100 种方法,但我不想那样做,我只想重用 ConcreteWindow 的实现,它们是所有人都使用相同的窗口句柄,但这当然不会编译。
我可以将这 100 个方法从 ConcreteWindow 复制/粘贴到 IGDBDetailWrapper,但这有点过头了,因为我可能还有另外 10 个这样的新接口和具体实现。
我可以在这里使用什么其他模式来帮助解决问题,而不是一次又一次地重新实现这 100 种方法?
谢谢
【问题讨论】:
-
你只是做错了。当一个纯接口具有多个功能时,它会变得非常乏味。但更糟糕的是,调试起来非常困难。只是不要,“窗口”需要一个基类才能实用。一定要看看其他人是如何做到这一点的,周围有很多很多的 GUI 包装库。
-
为什么不直接从 ConcreteWindow 继承?
-
这只是糟糕的库设计,因为基类中的 100 个方法太可怕了,
IDBDetail和IWindow之间的继承关系看起来不对。你不会找到干净的解决方案;该库的任何客户都必须使用一种或另一种解决方法。 -
P.S.:这个库很可能是由于试图直接从一些 Java 代码库转换类层次结构而产生的。但是在 Java 中,接口继承是隐式的
virtual。 IOW,interface Base { void f(); } interface D1 extends Base {} interface D2 extends Base {} class D implements D1, D2 { @Override public void f() {}}将起作用,但 C++ 等效项必须在D1和D2的类定义中显式指定virtual关键字。