在学校作业中,我有一个抽象类Person,一个扩展Person的抽象类Student,以及一个扩展学生的普通类CollegeStudent。 CollegeStudent从文件中读取并设置所有变量(包括属于抽象超类的变量)。这一切都很好。
但是,我们应该在抽象类中使用构造函数,这会使事情复杂化,因为这些类特别不应该能够自己读取输入。所以现在我有一种情况,我(可能)应该使用构造函数在各自的类中设置数据字段,但当然我需要首先读取输入!这里显而易见的问题是,superconstructor调用必须是CollegeStudent构造函数中的第一件事。这就是问题所在。
我可以按原样运行所有内容,然后使用另一个构造函数方法,该方法可以将所有需要的字段作为参数。但我不明白这是什么意思 - 为什么让Driver创建CollegeStudentobject然后再次创建它(使用第一个对象的ariables)只是为了使用构造函数?
除此之外,我不知道如何做到这一点,这个选项对我来说很奇怪 - 我不明白这是什么意思。
提前致谢...
答案 0 :(得分: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()
。