我必须构建一个库管理系统,并且在尝试实现用户类型或配置文件时遇到了问题。我已经有了一个超类用户和另外两个用户,学生和教师的子类,每个子类都有自己的“特征”。问题是我必须根据他们可以借用的书籍数量和他们可以保留书籍的时间来实现7种类型的用户(5种类型的学生和2种类型的职员),直到他们必须返回它们。这些是班级之间唯一的两个区别。
你会如何实现这个?遗产?我正在寻找一种聪明的方法来实现这一点,我很想听听你对此的看法。
非常感谢你。
答案 0 :(得分:2)
作为一个好的经验法则,无论你在项目规范中看到名词,它都是一个很好的候选人。如果这些名词在项目规范中有关系,那么它们也可能在你的代码中也有一个。
所有人都适合User
的类别,所以也许这应该是他们都会继承的界面。从这开始,它们似乎适合两个类别,Student
和Staff
也许这些也应该是抽象类/接口。然后你有7个具体的课程。 2继承Staff
,继承Student
。
所以你最终得到这样的东西..
当然,此设计取决于每个User
必须执行的操作,每个Staff
/ Student
必须执行的操作,但我会将非常具体的详细信息留给您。
答案 1 :(得分:1)
每个人都有一个“班级”,这限制了你的设计;因为,如果你想要添加一个学生或老师,你需要开始写一个新的课程。
类是模板,每个模板用于构造“类的实例”或更具体地“构造”。一个模板通常用于构造多个类(尽管对于不止一次使用的类不是必需,使用它一次(或根本不使用它)很好。)< / p>
所以你可以做到
public class Student {
private String name;
public Student(String name) {
this.name = name;
}
public string getName() {
return this.name;
}
}
public class Staff {
private String name;
public Staff(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
正如您所看到的,员工和学生之间会有很多重复。 getName()
,getAge()
,getPhoneNumber()
,getAddress()
等可以轻松应用于两者,在此结构下,您必须为{{1}复制这些方法}和Student
。
工作人员和学生的共同点是什么?它们都是Staff
,许多常用方法对所有人都是通用的。
People
此设计还会产生其他问题,因为它意味着工作人员不是学生,学生不是工作人员。在现实世界中,工作人员有时会报名参加课程,学生可以担任教学角色(想想老师的助手)。
最灵活的方法实际上并没有在学生和教职员之间产生结构差异,而是通过能力区分两者。
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
public Staff extends Person {
public void teachClass(Class class) {
...
}
}
public Student extends Person {
public void attendClass(Class class) {
...
}
}
然而,这个结构与你在课堂上呈现的例子完全不同,它侧面讲述了你应该学习的关于继承的课程。