編集:いくつかのコメントによると、単純とは、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++ 委員会に提案をしようと考えていました。誰かアドバイスがあれば、以下のコメントをいただければ幸いです (ただし、アドバイスを回答として提出しないでください)。