编辑:根据一些评论,简单的意思是a)代码更少,b)易于维护,c)很难出错。
编辑#2:此外,如果确实简化了InterfaceImpl
.
目前,我知道的唯一方法是让实现者定义抽象方法并将调用委托给目标基类型的方法。例子:
#include <iostream>
#include <memory>
class Interface
{
public:
virtual void method1() = 0;
virtual void method2(int x) = 0;
};
class MethodOneImpl
{
private:
void method1(int x)
{ std::cout << "MethodOneImpl::method1() " << x << std::endl; }
public:
void method1() { method1(0); }
};
class MethodTwoImpl
{
public:
void myFunc(int x)
{ std::cout << "MethodTwoImpl::myFunc(x)" << x << std::endl; }
};
class InterfaceImpl : public Interface
, private MethodOneImpl
, private MethodTwoImpl
{
public:
virtual void method1() { MethodOneImpl::method1(); }
virtual void method2(int x) { MethodTwoImpl::myFunc(x); }
};
int main()
{
std::unique_ptr<Interface> inf;
inf.reset(new InterfaceImpl);
inf->method1();
inf->method2(0);
// This should be disallowed!
// std::unique_ptr<MethodOneImpl> moi;
// moi.reset(new InterfaceImpl);
}
起初,我认为这也许可以解决问题:
class InterfaceImpl : public Interface
, private MethodOneImpl
, private MethodTwoImpl
{
public:
using MethodOneImpl::method1;
// Obviously this wouldn't work as the method names don't match.
//using MethodTwoImpl::???
};
第一个 using 语句将使这两个MethodOneImpl::method1
方法都公开,但它实际上不履行与 的约定Interface
,并且它修改了 的可访问性MethodOneImpl::method1(int)
。显然我们不能使用这个解决方案,method2
因为名称不匹配。
FWIW,我有我认为的解决方案,但它根本不是标准的一部分(换句话说,它不会编译)。我正在考虑向 C++ 委员会提出建议;如果有人有任何建议,我将不胜感激下面的任何评论(但请不要将建议作为答案提交)。