2

内部にネストされたクラスを持つ基本抽象クラスがあります。サブクラスの1つで、ネストされたクラスを拡張する必要がありますが、基本クラスから継承された抽象メソッドは、ネストされたクラスの基本クラス定義(戻り型と引数用)を想定しています。ネストされたクラスの新しい定義を使用させるにはどうすればよいですか?また、非抽象メソッド(オーバーライドしていません)も正しく機能しません(抽象クラ​​スに移動する前は正常に機能していました)。

abstract class Base {
    protected class Nested{
        ....
    }
    protected abstract Nested someMethod();
    protected void anotherMethod(Nested x){
        ......
    }
}
class Derived {
    class Nested extends Base.Nested {
        ....
    }
    protected Nested someMethod() {
        ......
    }
}
4

1 に答える 1

2

protected最善の方法は、オプションで抽象ファクトリメソッドを宣言してNestedクラスを作成することだと思います。

このようなもの:

abstract class Base {
    protected class BaseNested {
        ....
    }
    protected abstract BaseNested newNested();
}

class Derived extends Base {
    class DerivedNested extends BaseNested {
        ....
    }

    protected BaseNested newNested() {
       return new DerivedNested();
    }
}

次に、基本クラスが新しいを必要とする場合、の代わりにをBaseNested呼び出します。newNestednew DerivedNested()

何らかの理由でこれらのメソッドDerivedのみを処理する必要があり、処理する必要がない場合(その決定を慎重に評価する必要があります)、ジェネリックを使用できます。処理するネストされたクラスのタイプを入力します。Derived.NestedBase.NestedBase

abstract class Base<T extends BaseNested> {
    protected abstract T newNested();
    protected abstract T someMethod();
    protected void anotherMethod(T nested) {
        //...
    }
}

class Derived extends Base<DerivedNested> {
    protected DerivedNested newNested() {
       return new DerivedNested();
    }
    //...
}
于 2012-09-01T16:34:19.563 に答える