5

私は次のことをしたい:

class P {
  P(int a) {
    // construct
  }
}

class C extends P {
}

// in main
int a = 2;
C foo = new C(a); // can I do this?

"super(a)" のようにクラス C にコンストラクターを記述せずに、親クラス P のコンストラクターを呼び出して子オブジェクト C を作成したい。それは可能ですか?

アイデアは、「クラス P」と同じコンストラクター機能を必要とする「クラス C」のようなクラスがたくさんあるということです。そのため、新しい同様のクラスを作成するたびにコンストラクター メソッドを記述したくありません。

ありがとう

4

2 に答える 2

3

コンストラクターは継承されません。C引数を取るコンストラクタを宣言する必要があります。適切なスーパークラス コンストラクターを呼び出す必要があります (デフォルトのスーパークラス コンストラクターを呼び出したくない場合)。

宣言を避けることができる唯一のコンストラクターは、デフォルトの引数なしのコンストラクターであり、コンストラクターを宣言しない場合にのみ使用されます。これは、コンストラクターが宣言されていない場合、コンパイラーがコンストラクターを生成するためです。スーパークラス コンストラクターを明示的に呼び出さない限り、コンパイラは常に既定のスーパークラス コンストラクターへの呼び出しを挿入します。

スーパークラス コンストラクターを明示的に呼び出さず、スーパークラスに既定のコンストラクターがない場合は、コンパイル エラーが発生することにも注意してください。

編集:「クラス C のようなクラスがたくさん」ある場合、多くのコンストラクターを記述する代わりに、ファクトリ メソッド patternを使用します。すべてのクラスにデフォルトのコンストラクターを実装させinit()、標準の引数セットを受け取る個別のメソッドを提供できます。ファクトリ メソッドは、Class<? extends C>オブジェクトといくつかの初期化引数を受け取り、(既定のコンストラクターを使用して) 新しいインスタンスを生成し、初期化引数を使用してそのinitメソッドを呼び出します。initそうすれば、特別な処理が必要なサブクラスのメソッドをオーバーライドするだけで済みます(常に を呼び出すことを忘れないでsuper.initください)。

于 2013-08-26T03:14:20.120 に答える