0

私はこのライブラリを使用していますが、いくつかのスーパークラスでいくつかのメソッドをオーバーライドする必要がありました。私が今やっているのは、必要なクラスを拡張し、そのスーパークラスからオーバーライドする必要があるメソッドを再定義することです。

class A { ... }

class B extends A { ... }

class C extends A { ... }

class myD extends B {

    protected void overriddenAfunction() { ... }

}

いくつかのクラスが同じスーパークラスを拡張し、すべてのサブクラスで同じオーバーライドされたメソッドを使用する場合 (C で overridenAFunction() の同じ定義も必要な場合など)、これは明らかに適切ではありません。

これをきれいにするデザインパターンや方法はありますか?私はあなたがこのようなことができると想像しています:

class A { ... }

class B extends A { ... }

class C extends A { ... }

class myD extends A {

    private A BorC = null;

    public myD(A BorC) {

        this.BorC = BorC;

    }

    protected void overriddenAfunction() { ... }

    public void overriddenBfunction() { 

        ((B) BorC).overriddenBfunction();

    }

    public void overriddenCfunction() { 

        ((C) BorC).overriddenCfunction();

    }

}

Usage:

A testB = new myD(new B());
A testC = new myD(new C());

ただし、それが機能する場合でも、B と C のすべてのメソッドを挿入する必要があります。

より良い方法または回避策はありますか? 私がやりたいのは、ライブラリの再パッケージ化を避けることだけですが、それが本当に最善の解決策だと思いますか?

B と C のコピーを作成して myD を拡張し、myD が A を拡張することもできると思います。このライブラリにはすべてのソース ファイルも用意されているので、これまたは同様のことができます。

4

1 に答える 1

0

新しい機能Aを利用できるようにオーバーライドするB方法はありません。C私が見ることができるオプションは2つしかありませんが、両方について言及しています。

  • ライブラリを書き直しAて再パッケージ化する
  • 拡張してから、代わりにMyD拡張するとAのコピーを作成します。BCMyD
于 2012-07-20T09:14:21.747 に答える