Na Qt už jsme koukal, ale to mi nevyhovuje, protože když potřebuju přidat nové rozhraní a rozhodnu se ten privátní typ podědit např. ještě z třídy Context, tak pak musím do té public třídy přidat všechny metody z toho rozhraní a ty metody budu delegovat na ten privátní typ. To je hrozný. Jako už chápu, proč se všechno dělá v Javě, protože C++ je OOP asi jako Java funkcionální.
Pokud by člověku nevadil dynamic_cast, tak by se tomu kopírování šlo vyhnout. Něco na způsob (je to jen nápad):
Privátní třídy:
class base_private
{
public:
virtual ~base_private() {}
};
class A_private : public virtual base_private
{
private:
int a,b;
public:
virtual void metoda1();
virtual void metoda2();
};
class B_private : public virtual base_private
{
private:
int y,x;
public:
virtual void metoda3();
};
class C_private : public A_private, public B_private
{
};
Veřejné rozhraní:
class base
{
protected:
base_private *implementation;
base(base_private *implementation) : implementation(implementation) {}
~base() { delete implementation; }
};
class A : public virtual base
{
public:
A();
void metoda1();
void metoda2();
};
class B : public virtual base
{
public:
B();
void metoda3();
};
class C : public A, public B
{
public:
C();
};
Implementace do knihovny:
A::A() : base(new A_private())
{
}
void A::metoda1()
{
(dynamic_cast<A_private*> (implementation))->metoda1();
}
void A::metoda2()
{
(dynamic_cast<A_private*> (implementation))->metoda2();
}
B::B() : base(new B_private())
{
}
void B::metoda3()
{
(dynamic_cast<B_private*> (implementation))->metoda3();
}
C::C() : base(new C_private())
{
}
Uživatel pak bude moci používat třídy přímočaře:
void use()
{
C *c = new C();
c->metoda3();
}