You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java医院管理系统多态实现:医生统一患者列表改造问题

解决医院管理系统中的多态应用问题

Hey there! Let's fix this polymorphism issue for your hospital management system assignment. Here's a clear, step-by-step solution:

1. 精简Doctor类的患者列表

根据老师的要求,你只需要保留一个私有Patient类型的列表就足够了。因为Inpatient和Outpatient都是Patient的子类,利用多态特性,父类类型的集合可以直接存储所有子类对象,完全不需要单独维护住院和门诊患者的列表。

把Doctor类里多余的两个列表删掉,只保留私有版的患者列表:

private ArrayList<Patient> patients = new ArrayList<Patient>();

2. 完善addPatient方法

你的现有addPatient方法逻辑是对的,但要注意把列表改成私有后,后续如果需要外部访问(比如展示患者列表),可以新增一个getPatients()方法返回列表的副本(避免外部直接修改内部集合)。另外,弹窗可以优化一下,不用每次新建JFrame,直接传null也能正常显示:

修改后的addPatient方法:

public void addPatient(Patient a) {
    // 检查患者是否已存在
    for (Patient patient : patients) {
        if (patient.getRegistrationId() == a.getRegistrationId()) {
            JOptionPane.showMessageDialog(null, "Patient already added before!");
            return;
        }
    }
    patients.add(a);
}

3. 修复removePatient方法的潜在问题

你当前的remove方法存在一个小bug:当你删除列表中的元素时,后续元素会向前移位,普通for循环的索引会跳过下一个元素。推荐用倒序遍历或者迭代器来避免这个问题:

方案一:倒序遍历

public void removePatient(int registrationId) {
    for (int i = patients.size() - 1; i >= 0; i--) {
        if (patients.get(i).getRegistrationId() == registrationId) {
            patients.remove(i);
            // 如果只需要删除第一个匹配的患者,可以在这里加return
        }
    }
}

方案二:迭代器(更安全)

public void removePatient(int registrationId) {
    Iterator<Patient> iterator = patients.iterator();
    while (iterator.hasNext()) {
        Patient patient = iterator.next();
        if (patient.getRegistrationId() == registrationId) {
            iterator.remove();
            // 如需删除单个匹配项,可添加break;
        }
    }
}

4. 完整修改后的Doctor.java示例

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.JOptionPane;

public class Doctor extends Person{
    private int staffId;
    private double salary;
    // 仅保留私有Patient列表,利用多态存储子类对象
    private ArrayList<Patient> patients = new ArrayList<Patient>();

    // 构造方法(匹配你的初始化逻辑)
    public Doctor(int staffId, String name, int age, String sex, String address, double salary) {
        super(name, age, sex, address); // 假设Person类有对应构造方法
        this.staffId = staffId;
        this.salary = salary;
    }

    // 添加患者方法
    public void addPatient(Patient a) {
        for (Patient patient : patients) {
            if (patient.getRegistrationId() == a.getRegistrationId()) {
                JOptionPane.showMessageDialog(null, "Patient already added before!");
                return;
            }
        }
        patients.add(a);
    }

    // 删除患者方法(迭代器版)
    public void removePatient(int registrationId) {
        Iterator<Patient> iterator = patients.iterator();
        while (iterator.hasNext()) {
            Patient patient = iterator.next();
            if (patient.getRegistrationId() == registrationId) {
                iterator.remove();
                // 若只删第一个匹配项,添加break;即可
            }
        }
    }

    // 可选:提供获取患者列表的方法(返回副本避免内部集合被外部修改)
    public List<Patient> getPatients() {
        return new ArrayList<>(patients);
    }

    // 其他getter/setter方法
    public int getStaffId() {
        return staffId;
    }

    public void setStaffId(int staffId) {
        this.staffId = staffId;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
}

5. 测试类无需修改

你的test.java里的调用逻辑完全正确:

public static void main(String args[]){
    // 假设h是Hospital类实例
    Doctor d = new Doctor(111222, "ali", 50, "m", "ankara", 6000);
    h.addDoctor(d);
    Inpatient in = new Inpatient(333444, "veli", 32, "m", "istanbul", 345.40, 410);
    d.addPatient(in); // 子类对象传入父类参数,多态生效
    Outpatient out = new Outpatient(555666, "helin", 28, "f", "izmir", 610.35);
    d.addPatient(out); // 同样支持门诊患者
}

这样修改后,你就完全符合老师的要求了:仅用一个私有患者列表,通过多态同时管理住院和门诊患者,增删方法也能统一处理所有患者类型。

内容的提问来源于stack exchange,提问作者user10186856

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:37:19