1

在完成一项学校作业时,我有一个抽象类 Person,一个扩展 Person 的抽象类 Student,以及一个扩展 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 回答