1

学校の課題に取り組んでいる私は、抽象クラス Person、抽象クラス Person を拡張する Student、および学生を拡張する通常のクラス CollegeStudent を持っています。CollegeStudent はファイルから読み取り、すべての変数 (抽象スーパークラスに属するものを含む) を設定します。これはすべて正常に機能します。

ただし、抽象クラスにはコンストラクターが必要であり、これらのクラスは特に入力を独自に読み取ることができないため、複雑になります。そのため、(おそらく) コンストラクターを使用してそれぞれのクラスのデータ フィールドを設定することになっている状況がありますが、もちろん、最初に入力を読み取る必要があります。ここでの明らかな問題は、スーパーコンストラクターの呼び出しが CollegeStudent のコンストラクターの最初のものでなければならないことです。これが問題です。

すべてをそのまま実行してから、必要なすべてのフィールドをパラメーターとして受け取ることができる別のコンストラクター メソッドを使用できます。しかし、それが何を意味するのかわかりません。コンストラクターを使用するためだけに、ドライバーが CollegeStudent オブジェクトを作成し、(最初のオブジェクトの変数を使用して) 再度作成する必要があるのはなぜですか?

それ以外は、これがどのように行われるのかわかりません。また、このオプションは私には奇妙です--私にはポイントがわかりません。

前もって感謝します...

4

1 に答える 1

4

わかりました、私のコメントを詳しく説明しましょう。コンストラクターは、ファイルを読み取って独自のパラメーターを見つけるべきではありません。それはその仕事ではありません。私が正しく理解していれば、あなたの問題はあなたが持つ必要があるということです

public CollegeStudent(File f) {
    // get a, b and c from the file, but how?
    super(a, b, c);
}

ただし、a、b、および c はファイルから取得されます。super はコンストラクターの最初の命令でなければならないため、super を呼び出す前にファイルを読み取ることはできません。

代わりにファクトリ メソッドを使用する必要があります。

public CollegeStudent(int a, int b, int c) {
    super(a, b, c);
}

public static CollegeStudent createFromFile(File f) throws IOException {
    int a;
    int b;
    int c;
    // TODO: read the file and initialize a, b and c
    return new Student(a, b, c);
}

呼び出し元は、ファイルから CollegeStudent を構築するために、単に呼び出します。

CollegeStudent cs = CollegeStudent.createFromFile(file);

これは、よく使用される典型的な OO パターンです。Integer.valueOf()たとえば、 を参照してください。

于 2012-11-05T23:20:53.893 に答える