超级()难题

时间:2012-11-05 23:03:24

标签: java constructor superclass super

在学校作业中,我有一个抽象类Person,一个扩展Person的抽象类Student,以及一个扩展学生的普通类CollegeStudent。 CollegeStudent从文件中读取并设置所有变量(包括属于抽象超类的变量)。这一切都很好。

但是,我们应该在抽象类中使用构造函数,这会使事情复杂化,因为这些类特别不应该能够自己读取输入。所以现在我有一种情况,我(可能)应该使用构造函数在各自的类中设置数据字段,但当然我需要首先读取输入!这里显而易见的问题是,superconstructor调用必须是CollegeStudent构造函数中的第一件事。这就是问题所在。

我可以按原样运行所有内容,然后使用另一个构造函数方法,该方法可以将所有需要的字段作为参数。但我不明白这是什么意思 - 为什么让Driver创建CollegeStudentobject然后再次创建它(使用第一个对象的ariables)只是为了使用构造函数?

除此之外,我不知道如何做到这一点,这个选项对我来说很奇怪 - 我不明白这是什么意思。

提前致谢...

1 个答案:

答案 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()