2012-11-05 52 views
1

在一个学校任务上工作时,我有一个抽象类Person,一个抽象类Student以及一个扩展Person的普通类CollegeStudent。 CollegeStudent从文件中读取并设置所有变量(包括属于抽象超类的那些变量)。所有这些工作正常。超级()难题

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

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

除此之外,我不知道如何做到这一点,这个选项对我来说很奇怪 - 我没有看到重点。

在此先感谢...

+0

我觉得这个问题很难理解。 –

+9

主要问题是设计:构造函数不应该读取文件。这不是一个构造函数的工作。改用工厂方法。 –

+0

当我们不知道任务的任意约束是什么时,很难提供帮助。 – climbage

回答

4

OK,让我阐述我的意见。构造函数不应该读取文件来查找自己的参数。这不是它的工作。如果我理解正确,你的问题是你需要有

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); 

这是一个典型的面向对象的模式,也就是常用过的。例如,请参阅Integer.valueOf()

+0

我想我是理解的:基本上司机会打电话给你第二种方法来创建班级。但是......那么第一个构造函数的目的是什么? –

+0

哦,我明白了......没有注意到@最后......谢谢!现在明白了! –

+0

说一切都可以从createFromFile方法初始化,并且我们使用该构造函数的唯一原因是为了OO,是否正确?我只是想确保我得到这个正确的... –