Java面向对象编程和多态性

标签 java object polymorphism

假设有 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 的答案回答了你的问题,但我认为你的类层次结构正陷入兔子洞。 “一个人是一个经理”的假设在任何时刻都没有问题,但是一旦将数据库纳入考虑范围,模型就会随着时间的推移而恶化。例如,您今天可能是学生,明年是员工,将来某个时候是经理。为此,我们通常使用组合而不是继承。

最好的方法是对现实世界中的角色进行建模 - 一个人在规定的时间段内是学生,在以后的一段时间内是员工,甚至更晚的时候是经理。通常的方法是拥有三个数据库表:

  1. 人,保存有关实际人的数据。例如姓名、出生日期、性别。
  2. 角色,每个可能的角色包含一条记录 - 例如头衔、财务权限
  3. PersonRole,其中包含定义人员所具有的角色的记录。该表将具有 Person 和 Role 的外键,以及 startDate 和 endDate 字段。

这种结构的优点是您可以通过简单的数据输入来添加新角色。

此外,我会避免将持久性逻辑放入类中。这意味着任何时候您使用类(class)时,都需要有一个可用的数据库。在小型系统中这不是问题,但将基本类打包到库中并由许多应用程序使用是很常见的。另外,如果使用 Java,数据库连接是不可序列化的,这一点有一天会再次困扰您。存储库模式巧妙地解决了这个问题,Google 将向您展示如何实现。

祝您的项目顺利

关于Java面向对象编程和多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76644999/

相关文章:

java - 在 Java 中将半带和全带 CJK 拉丁字符转换为 ASCII

java - 如何使用 System.out.println 打印方法的结果

c++ - 无法制作包含 ptr_vector<an_abstract_class> 的类的 vector

android - 使用 Gson2.1 和 asmx web 服务在 Json 字符串中保留多态性

perl - 如何在我的父类中创建一个对象,但在 Perl 中将它祝福到我的子类中?

java - 使用 PDFBox 设置字符间距

Java:创建变量类的实例

javascript - Jquery 对象在排序后未定义,但在 firebug 中

javascript - 循环结果中 undefined object

c++ - 错误 LINK2005 已在 Main.obj 中定义