首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Super()难题

Super()难题
EN

Stack Overflow用户
提问于 2012-11-06 07:03:24
回答 1查看 110关注 0票数 1

在完成一项学校作业时,我有一个抽象类Person,一个抽象类“学生”,它扩展了Person,还有一个常规类CollegeStudent,它扩展了“学生”。CollegeStudent从文件中读取并设置所有变量(包括那些属于抽象超类的变量)。所有这些都运行得很好。

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

我可以让一切按原样运行,然后使用另一个构造函数方法,该方法可以将所有需要的字段作为参数。但是我不明白这有什么意义--为什么仅仅为了使用构造函数,驱动程序要创建CollegeStudentobject,然后再创建一次(使用第一个对象中的变量)?

除此之外,我不知道如何做到这一点,而且这个选项对我来说很奇怪--我看不出有什么意义。

先谢谢你...

EN

回答 1

Stack Overflow用户

发布于 2012-11-06 07:20:54

好的,让我详细解释一下我的评论。构造函数不应该通过读取文件来找到自己的参数。这不是它的工作。如果我没理解错的话,你的问题是你需要

代码语言:javascript
复制
public CollegeStudent(File f) {
    // get a, b and c from the file, but how?
    super(a, b, c);
}

但是a,b和c来自一个文件。因为super必须是构造函数的第一条指令,所以你不能在调用super之前读取文件,所以你注定要失败。

您应该改用工厂方法:

代码语言:javascript
复制
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,只需调用

代码语言:javascript
复制
CollegeStudent cs = CollegeStudent.createFromFile(file);

这是一个典型的OO模式,它经常被使用。例如,请参见Integer.valueOf()

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13241794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档