2009-09-06 21 views
14

私は、自動的にすべての子クラスによって継承されます引数を持つコンストラクタを持つようにしたいが、Javaは私がやらないだろう、こののJava:継承コンストラクタ

class A { 
    public A(int x) { 
    // Shared code here 
    } 
} 

class B extends A { 
    // Implicit (int x) constructor from A 
} 

class C extends A { 
    // Implicit (int x) constructor from A 
} 

私が持っている必要はありません子クラスごとにB(int x),C(int x)などを書きます。この問題に近づくよりスマートな方法がありますか?

ソリューション#1。コンストラクタの後に呼び出すことができるinit()メソッドを作成します。これは機能しますが、私の特別な設計では、コンパイル時に検証される特定のパラメータをコンストラクタで指定する必要があります(varargs/reflectionを使用しないなど)。

答えて

26

できません。基本クラスにパラメーター化されたコンストラクターを持ち、引数のないコンストラクターを必要としない場合は、子孫クラスのそれぞれにコンストラクターを定義して(super()コンストラクターを呼び出す)必要があります。

+14

どのようなバマーなのですか。 – machete

+1

何回何回このことを思い出されても、それはまだ怒っています。包括的なベースクラスを作るためにこのすべての努力を払うと、あまりにも多くの定型文を上書きしなければならないので、子どもたちは50ライナーになります。 –

2

Javaでは実行できません。このメソッドで明示的に宣言しなくても、メソッドの引数を与えることはできません。これを行うことは、おそらく最良のアイデアではないでしょう。それは、非常に混乱したコードや複雑なものにつながる可能性があります。いくつか余分な文字を入力する代わりに、が悪いではありません。 :D

4

Inheritance

概要:サブクラスはそのスーパークラスからの全て メンバー(フィールド、メソッド、およびネストされた クラス)を継承します。 コンストラクタはメンバではないため、 はサブクラスによって継承されませんが、 スーパークラスのコンストラクタはサブクラスから を呼び出すことができます。

12

他の回答は、Javaがコンストラクタを継承させることはできません。しかし、IDEを使用すると、すべてのクラスでこれらを作成する際の負担を軽減できます。

「ソース」メニューから「スーパークラスからコンストラクタを生成...」を選択します。ダイアログを使用して新しいクラスを作成するときに、これをオプションとして選択することもできます。

+5

Hmmm ... 1人の "大負担"は他の人の些細な作業です。 –

+0

IntelliJ IDEAでは、Alt + Insertを押してコンストラクタを選択できます。これにより、実装する1つまたは複数の親コンストラクタを選択できるメニューが表示され、自動的に作成されます。 – Patrick

0

割り当てたいデフォルト値がある場合は、パラメータ化されたコンストラクタを呼び出す基本クラスに空のコンストラクタを作成できます。

これにより、パラメータ化されたコンストラクタを呼び出す子クラスが不要になります。