61

私はここで深刻な101の質問をしていることを知っています...

私はいくつかのクラスFooBar拡張するクラスを持っていますFooFooフィールドに設定する一連のパラメーターを受け取るコンストラクターがあります。などの派生クラスでBarは、通常、これを変更する必要はありません。今私のIDEは私に"Fooで利用可能なデフォルトのコンストラクターはありません" . 少しグーグルで調べてみると、これは「コンストラクターが継承されていない」ことが原因のようです。これですべてうまくいきましたが、すべての派生クラスでこのコンストラクターを複製せずにこれを機能させるにはどうすればよいでしょうか? もっとまともなアプローチがあると思いますか?

4

7 に答える 7

77

superコンストラクターを使用します。

public Bar(int a, double b, ...) {
    super(a, b, ...);
}
于 2013-06-12T14:43:23.257 に答える
5

いいえ、これ以上「正気」なアプローチはありません。基本クラスにデフォルトのコンストラクターがない場合は、すべての子クラスから正しいコンストラクターを明示的に呼び出す必要があります。

これは、子クラスが基本クラスとまったく同じコンストラクタを持つ必要があるという意味ではないことに注意してください。たとえば、これは完全に有効です。

class Foo {

    protected int a;
    protected int b;

    protected Foo(final int a, final int b) {
        this.a = a;
        this.b = b;
    }
}

class Bar extends Foo {

    protected Bar() {
        super(0,0);
    }
}
于 2013-06-12T14:43:34.307 に答える
3

問題はこれで解決されます:

class Foo{
       Foo(int a, int b){}
}

class Bar extends Foo{
         //Here must be a constructor OR declare a constructor in Foo without parameters
         Bar(){super(1,1)} //this is an example

}

他の解決策は次のとおりです。

class Foo{
   Foo(int a, int b){}
   Foo(){}
}

class Bar extends Foo{
}

SuperClass (この場合は Foo) にパラメーターを持つコンストラクターがある場合、子クラス(この場合は Bar) の暗黙的なコンストラクターは常に " Super() "への暗黙的な呼び出しを行うことに注意してください(常に 1 つでなければなりません)明示的でない限り)。

于 2013-06-12T14:49:13.317 に答える
0

設計上の理由により、デフォルトのコンストラクターを提供している場合、JVM はデフォルトのコンストラクターを提供しません。できること Bar でコンストラクターを同じ署名で定義し、super() を呼び出します。

public Bar(int x,int y) {
    super(x,y);
}
于 2013-06-12T14:47:45.833 に答える