別の開発者によって作成されたクラス (ソースを持っていない) に基づいて構築されたアプリケーションを開発しています。
上記のクラスのすべての機能を使用したいだけでなく、追加機能で拡張したいと考えています。通常、これを実現するには、インターフェイス ( MyInterface ) を定義し、MyInterfaceを実装しながら、自分自身 ( MyClass ) から外部クラス ( TheirClass ) を拡張します。
public interface TheirClassInterface {
public void theirMethod1();
public void theirMethod2();
}
public class TheirClass implements TheirClassInterface {
public void theirMethod1() { ... }
public void theirMethod2() { ... }
}
public class TheirOtherClass {
public void theirOtherMethod1(TheirClassInterface o) { ... }
}
public interface MyInterface() {
public void myMethod1();
}
public class MyClass extends TheirClass implements MyInterface {
public void myMethod1() { ... }
}
public class MyNewClass extends MyClass {
public void MyNewClassMethod() { ... }
}
この問題は、次の事実によって複雑になります。
- MyClassに機能を追加する新しいクラス ( MyNewClass ) を作成したいと考えていますが、自分のコードをTheirClassに依存させたくありません。
- クラスをTheirOtherClassのメソッドのパラメーターとして使用できるようにしたいと考えています。
これに対抗するために、コードをリファクタリングして、代わりに継承よりも構成を使用し、TheirClassInterfaceを実装しました。これは機能しますが、多くのメソッドを実装し、それらをtheirClassObjectに委譲する必要があります(実際には、 TheirClassInterfaceには非常に多数のメソッドが含まれています)。
public interface TheirClassInterface {
public void theirMethod1();
public void theirMethod2();
}
public class TheirClass implements TheirClassInterface {
public void theirMethod1() { ... }
public void theirMethod2() { ... }
}
public class TheirOtherClass {
public void theirOtherMethod1(TheirClassInterface o) { ... }
}
public interface MyInterface() {
public void myMethod1();
}
public class MyClass implements TheirClassInterface, MyInterface {
private TheirClass theirClassObject;
public void myMethod1() { ... }
public void theirMethod1() { theirClassObject.theirMethod1(); }
public void theirMethod2() { theirClassObject.theirMethod2(); }
}
public class MyNewClass extends MyClass {
public void MyNewClassMethod() { ... }
}
私の質問は、この場合に私のアプローチが適切かどうか、および私のコードが仕事を成し遂げるために過度の量の委任を使用しているように見えるので、改善できるかどうかです。
誰でもこれについて与えることができるガイダンスに感謝します。
ダニー