これは他の回答と非常に似ていますが、抽象クラスをインスタンス化しようとしないという点で異なります。
似ている 3 つの回答はすべて、Composition を使用して問題を解決しています。ある人はそれをファサードと呼び、別のアダプターと呼びます。私はそれをプロキシと呼んでいます。どちらが正しいかはわかりません。3 つすべてにおいて重要な事実は、継承の代わりに合成を使用することです。
インターフェイスを作成することから始めます。例えば:
public interface iA
{
public void doA();
}
public interface iB
{
public void doB();
}
抽象クラスを変更してこれらのインターフェースを実装する
abstract class A implements iA
{
public void doA()
{
... blah ...
}
}
abstract class B implements iB
{
public void doB()
{
... blah ...
}
}
A と B の具体的なバージョンを作成し (ここでは C の内部クラスとしてこれを行います)、C で両方のインターフェイスを実装し、C クラスからの呼び出し doA() と doB() を具体的な実装にプロキシします。
public class C implements iA, iB
{
private ConcreteA cA = new ConcreteA();
private ConcreteB cB = new ConcreteB();
public void doA()
{
cA.doA();
}
public void doB()
{
cB.doB();
}
private class ConcreteA extends A
{
public doA()
{
... blah ...
}
}
private class ConcreteB extends B
{
public doB()
{
... blah ...
}
}