単一のintをパラメーターとして取るコンストラクターで親クラスを作成しようとしています。また、2つのintを取るコンストラクターを使用して、親クラスの2つのインスタンスを作成する子クラスを派生させる必要もあります。 「super」キーワードを使用して親クラスのコンストラクターを使用していることはわかっていますが、子コンストラクターの2番目のintを使用して同じ親コンストラクターを呼び出すにはどうすればよいですか? 「super」を2回使用できないので、2番目のパラメーターを使用する他の方法はありますか?子コンストラクタをmainメソッドから2回呼び出すだけでよいことはわかっていますが、2つのパラメータを受け取り、親クラスの2つのオブジェクトを作成する子コンストラクタが特に必要です。ありがとう。
public class Int
{
public int numberOne;
public Int(int numberHere)
{
numberOne = numberHere;
}
//methods...
}
public class Rational extends Int
{
Int numerNum;
Int denomNum;
public Rational(int oneHere, int twoHere)
{
super(oneHere);
}
//methods...
}
composition を使用する必要があるときに、 inheritance を使用しようとしています。
代わりにこれを出発点として使用してください:
public class Rational {
private Int numerator;
private Int denominator;
public Rational(int num, int den) {
numerator = new Int(num);
denominator = new Int(den);
}
}
一般的な経験則として、継承は「Is-a」関係に最適です。 「有理数は整数ですか?」と自問してください。答えは明らかにノーです。
継承により、「is-a」関係をモデル化します。 RationalをIntegerのサブクラスにすることで、基本的にRational IS A Integer(そうですか?).
さらに、オブジェクトまたはそのスーパークラスのコンストラクターは、そのオブジェクトを初期化するために使用されます。コンストラクターを使用して複数のオブジェクトを初期化することはできません。
あなたが本当にやりたいことは、「has-a」関係をモデル化することです。有理数には、分母と分子の2つの整数があります。 2つのIntメンバーを持つことでモデル化できます。
問題は、「is a」関係ではない何かをモデル化するために継承を悪用していることです。有理数は「整数ではありません」。また、2つの整数ではありません– Javaでは、1つのclass
からのみ導出できるという事実を除けば、逆に、有理数には2つの整数があります:分子コードには、これをすでに認識しているが完全には認識していない兆候があります。つまり、継承関係を削除して、2つのメンバーを割り当てるだけです。
public final class Int {
private final int value;
public Int(final int val) {
this.value = val;
}
}
public final class Rational {
private final Int numerator;
private final Int denominator;
public Rational(final int numer, final int denom) {
this.numerator = new Int(numer);
this.denominator = new Int(demom);
}
}
実際、new
を使用してInt
オブジェクトを作成するのではなく、コンストラクターに渡すことをお勧めします。
public final class Rational {
private final Int numerator;
private final Int denominator;
public Rational(final Int numer, final Int denom) {
this.numerator = numer;
this.denominator = demom;
}
}