假设有 20 个从主类派生的子类。假设每个类也有自己的属性。假设我们有一个经理类;它以主类作为参数并添加数据库。我们可以将参数指定为多态,是的,但是当添加数据库时,它自己的特殊功能无法通过多态来访问。由于有20个,在if中单独使用instance of没有多大意义。可以做什么?
public class Person {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Student extends Person {
private int studentNo;
public int getStudentNo() {
return studentNo;
}
public void setStudentNo(int studentNo) {
this.studentNo = studentNo;
}
}
public class PersonManager {
public void add(Person person) {
System.out.println("saved: " + person.getName());
System.out.println("saved: " + person.getId());
}
}
最佳答案
@BoppreH 的答案回答了你的问题,但我认为你的类层次结构正陷入兔子洞。 “一个人是一个经理”的假设在任何时刻都没有问题,但是一旦将数据库纳入考虑范围,模型就会随着时间的推移而恶化。例如,您今天可能是学生,明年是员工,将来某个时候是经理。为此,我们通常使用组合而不是继承。
最好的方法是对现实世界中的角色进行建模 - 一个人在规定的时间段内是学生,在以后的一段时间内是员工,甚至更晚的时候是经理。通常的方法是拥有三个数据库表:
- 人,保存有关实际人的数据。例如姓名、出生日期、性别。
- 角色,每个可能的角色包含一条记录 - 例如头衔、财务权限
- PersonRole,其中包含定义人员所具有的角色的记录。该表将具有 Person 和 Role 的外键,以及 startDate 和 endDate 字段。
这种结构的优点是您可以通过简单的数据输入来添加新角色。
此外,我会避免将持久性逻辑放入类中。这意味着任何时候您使用类(class)时,都需要有一个可用的数据库。在小型系统中这不是问题,但将基本类打包到库中并由许多应用程序使用是很常见的。另外,如果使用 Java,数据库连接是不可序列化的,这一点有一天会再次困扰您。存储库模式巧妙地解决了这个问题,Google 将向您展示如何实现。
祝您的项目顺利
关于Java面向对象编程和多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76644999/