2

別の開発者によって作成されたクラス (ソースを持っていない) に基づいて構築されたアプリケーションを開発しています。

上記のクラスのすべての機能を使用したいだけでなく、追加機能で拡張したいと考えています。通常、これを実現するには、インターフェイス ( 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() { ... }
}

この問題は、次の事実によって複雑になります。

  1. MyClassに機能を追加する新しいクラス ( MyNewClass ) を作成したいと考えていますが、自分のコードをTheirClassに依存させたくありません。
  2. クラスを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() { ... }
}

私の質問は、この場合に私のアプローチが適切かどうか、および私のコードが仕事を成し遂げるために過度の量の委任を使用しているように見えるので、改善できるかどうかです。

誰でもこれについて与えることができるガイダンスに感謝します。

ダニー

4

3 に答える 3

0

できません-クラスを拡張する場合は、クラスに依存します。Humanそれは、の定義に依存しないの定義を持っているようなものですMammal。あなたのオプティノは、親のすべてを書き直すか、それに依存します。

于 2012-08-03T15:35:26.593 に答える
0

これまでの回答に感謝します。私は合理的だと思う解決策を考え出し、外国のクラスを完全にカプセル化することができます。

現時点では、コードの最初のブロック(以下で繰り返して拡張)で説明したメソッドに戻り、MyNewClassのMyInterfaceインターフェイスを実装し、すべてのインターフェイス操作を構成されたオブジェクトに委任しています。委任先のオブジェクトは、ファクトリで静的メソッドを呼び出すことによって実行時に決定されます。

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 implements MyInterface {
    private MyInterface myObject;

    public MyNewClass() {
        myObject = MyClassFactory.createMyClass();
    }

    public void myMethod1() {
        myObject.myMethod();
    }

    public void MyNewClassMethod() { ... }
}

もう一度、アイデアに感謝します。次に、それらすべてを調べて、コードを改善するためにそれらを使用できるかどうかを確認します。

乾杯、

ダニー

于 2012-08-03T15:53:32.497 に答える