1

スーパークラスを拡張するサブクラスがあります。スーパークラスのコンストラクターに a 、b、c のようなパラメーターがある場合MySuperClass(int a, string b, string c)サブクラスのコンストラクターには、 a、d、e のようなパラメーターがありますMySubClass(int a, int d, int e)。サブクラスのコンストラクターの内部には何を入れる必要がありますか? パラメータasuper(a)のコードを複製する必要がないように言えますか? ただし、super のコンストラクターには 3 つのパラメーターがあります。だから私はそれができないと思います。

また、スーパーの使用を無視してフィールドをパラメーターに割り当てると (のようにthis.fieldName=parameterName)、「スーパーにはデフォルトのコンストラクターがありません」というエラーが表示されます。

public abstract class Question {

    // The maximum mark that a user can get for a right answer to this question.
    protected double maxMark;

    // The question string for the question.
    protected String questionString;

    //  REQUIRES: maxMark must be >=0
    //  EFFECTS: constructs a question with given maximum mark and question statement
    public Question(double maxMark, String questionString) {
        assert (maxMark > 0);

        this.maxMark = maxMark;
        this.questionString = questionString;
    }
}

public class MultiplicationQuestion extends Question{

    // constructor
    // REQUIRES: maxMark >= 0
    // EFFECTS: constructs a multiplication question with the given maximum 
    //       mark and the factors of the multiplication.
    public MultiplicationQuestion(double maxMark, int factor1, int factor2){
        super(maxMark);
    }
}
4

2 に答える 2

2

コンストラクターが常に行う最初のことは、そのスーパークラスのコンストラクターを呼び出すことです。呼び出しを省略しても、これを回避することはできません。これは、明示的に指定する (つまり、既定のコンストラクターを呼び出す)super手間を省くための単なる構文糖衣です。super()

あなたができることは、スーパークラスのコンストラクターにデフォルト値を渡すことです。例えば:

public class SubClass {
    private int d;
    private int e;

    public SubClass(int a, int d, int e) {
        super(a, null, null);
        this.d = d;
        this.e = e;
    }
}
于 2016-10-24T17:36:01.687 に答える
1

スーパークラスのコンストラクターが MySuperClass(int a, string b, string c) のようにパラメーター a、b、c を持っている場合。サブクラスのコンストラクターには、MySubClass(int a, int d, int e) のようなパラメーター a,d,e があります。サブクラスのコンストラクター内には何が必要ですか?

この決定を下すのはあなただけです。これは、ビジネス ケースにとって数字が何を意味するかに依存するためです。それらが意味的な意味を持たない単なる数字である限り、それは問題ではありません。

パラメータ a のコードを複製する必要がないように、super(a) と言っていいですか?

いいえ、どのクラスのコンストラクターのパラメーターまたは定数をスーパークラスのコンストラクターに渡す必要があるかを指定する必要があります。繰り返しますが、「自動」ソリューションはありません。どの値がスーパー クラス コンストラクターに渡され、どこから取得されるかを決定するのは、プログラマーとしての責任です。

スーパークラスにコンストラクターがあるのに、なぜこれを取得するのですか?

スーパー クラス コンストラクターは、既定のコンストラクターではありません (パラメーターを持たない)。

そして、どうすればこの問題を解決できますか?

繰り返しますが、これには一般的な答えはありません。通常、唯一の有効な方法は、スーパー クラス コンストラクターに渡す値を提供することです。非常にまれなケースですが、追加のデフォルト コンストラクタを作成することが適切な場合があります。

于 2016-10-24T17:43:05.420 に答える