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
相关产品推荐
相关产品推荐

