如何在不继承Pole类的前提下,显示Hospital关联的Pole信息?
问题描述
我定义了三个Java类:Establishment类、继承自Establishment的Hospital类,以及Pole类。每个Hospital包含多个Pole,现在我希望在显示Hospital信息时,同时展示该Hospital关联的Pole信息,但Hospital并未继承Pole类,请问这是否可行?该如何实现?
现有代码实现
Pole类
public class Pole{ private String name; private String address; private int nTelephone; private String hospital; public Pole(){ name = ""; address = ""; nPhone = 0; hospital = ""; } public Pole(String name, int nTelephone, String address, String hospital){ this.name = name; this.address = address; this.nPhone = nPhone; this.hospital = hospital; } public void setPole(String name, int nTelephone, String address, String hospital){ this.name = name; this.address = address; this.nPhone = nPhone; this.hospital = hospital; } public void getPole(){ System.out.println("Name: " + name); System.out.println("Address: " + address); System.out.println("Phone number: " + nPhone); System.out.println("Belongs to hospital " + hospital); } }
Hospital类
public class Hospital extends Establishment{ private String address; public Hospital(){ address = ""; } public Hospital (String name, String address, String email){ super(name, email); this.address = address; } public void setHospital(String name, String address, String email){ setHospital(name, email); this.address = address; } public void getHospital(){ getEstablishment(); System.out.println("Address:"+ this.address); } public String getHospitalName(){ return getEstablishmentName(); } }
Establishment类
public class Establishment{ private String name; private String email; public Establishment(){ name = ""; email = ""; } public Establishment (String name, String email){ this.name = name; this.email = email; } public void getEstablishment(){ System.out.println("Name: " + this.name); System.out.println("Email: " + this.email); } public void setEstabelecimento(String name, String email){ this.name = name; this.email = email; } public String getEstablishmentName(){ return this.name; } }
addHospital方法
public void addHospital() { Scanner r = new Scanner(System.in); String name; String email; String address; String namePole; String addressPole; int nTelPole; int addPole; System.out.println("==== Add Hospital ===="); System.out.println("Enter name"); name = r.nextLine(); System.out.println("Enter email"); email = r.nextLine(); System.out.println("Enter address"); address = r.nextLine(); numberHospitals++; unidadesHospitalares[numHospitals - 1] = new Hospital(); unidadesHospitalares[numHospitals - 1].setHospital(name, email, address); System.out.println("==== Add Pole===="); System.out.println("Enter name"); namePole = r.nextLine(); System.out.println("Enter phone number"); nTelPole = r.nextInt(); r.nextLine(); System.out.println("Enter the address"); addressPole = r.nextLine(); r.nextLine(); // 清除输入缓冲区 numPoles ++; poles[numPoles - 1] = new Pole(); String associatedHospital = hospitalUnits[numeroHospitais - 1].getNameHospital(); poles[numPoles - 1].setPole(namePole, nTelPole, addressPole, associatedHospital); sleep(3000); clear(); }
当前showHospital方法
public void showHospital(){ if (numberHospitals == 0){ System.out.println("There are no Hospitals!"); } System.out.println("==== Hospitals ===="); for (int i =0 ; i< numeroHospitals ; i++){ unitsHospitals[i].getHospital(); System.out.println("===="); } sleep(3000); clear(); menuHospital(); }
可行性分析与实现方案
完全可行。Hospital和Pole是关联关系(has-a),而非继承关系(is-a),不需要通过继承就能实现关联信息的展示。以下是具体实现步骤:
1. 给Hospital类添加集合存储关联的Pole
在Hospital中维护一个List<Pole>集合,用于保存属于该医院的所有科室,同时提供添加科室的方法:
import java.util.ArrayList; import java.util.List; public class Hospital extends Establishment{ private String address; // 新增集合存储关联的Pole private List<Pole> poles = new ArrayList<>(); public Hospital(){ address = ""; } public Hospital (String name, String address, String email){ super(name, email); this.address = address; } // 修复原方法的递归错误:调用父类的setEstabelecimento而非自身setHospital public void setHospital(String name, String address, String email){ super.setEstabelecimento(name, email); this.address = address; } public void getHospital(){ getEstablishment(); System.out.println("Address:"+ this.address); // 新增:展示关联的Pole信息 if(!poles.isEmpty()){ System.out.println("--- 关联科室信息 ---"); for(Pole pole : poles){ pole.getPole(); System.out.println("-------------------"); } } } public String getHospitalName(){ return getEstablishmentName(); } // 新增:添加Pole到当前医院的方法 public void addPole(Pole pole){ poles.add(pole); } }
2. 修正Pole类的变量名错误
原代码存在变量名不一致问题(定义nTelephone但赋值用nPhone),统一修正:
public class Pole{ private String name; private String address; private int nTelephone; private String hospital; public Pole(){ name = ""; address = ""; nTelephone = 0; hospital = ""; } public Pole(String name, int nTelephone, String address, String hospital){ this.name = name; this.address = address; this.nTelephone = nTelephone; this.hospital = hospital; } public void setPole(String name, int nTelephone, String address, String hospital){ this.name = name; this.address = address; this.nTelephone = nTelephone; this.hospital = hospital; } public void getPole(){ System.out.println("Name: " + name); System.out.println("Address: " + address); System.out.println("Phone number: " + nTelephone); System.out.println("Belongs to hospital " + hospital); } }
3. 修改addHospital方法,关联Pole到对应Hospital
调整逻辑,将创建的Pole直接添加到对应的Hospital对象中:
public void addHospital() { Scanner r = new Scanner(System.in); String name; String email; String address; String namePole; String addressPole; int nTelPole; System.out.println("==== 添加医院 ===="); System.out.println("输入名称"); name = r.nextLine(); System.out.println("输入邮箱"); email = r.nextLine(); System.out.println("输入地址"); address = r.nextLine(); // 创建并初始化Hospital对象 numberHospitals++; Hospital newHospital = new Hospital(name, address, email); unidadesHospitalares[numberHospitals - 1] = newHospital; System.out.println("==== 添加科室 ===="); System.out.println("输入科室名称"); namePole = r.nextLine(); System.out.println("输入电话号码"); nTelPole = r.nextInt(); r.nextLine(); // 清除输入缓冲区 System.out.println("输入科室地址"); addressPole = r.nextLine(); // 创建Pole并关联到当前医院 Pole newPole = new Pole(namePole, nTelPole, addressPole, newHospital.getHospitalName()); newHospital.addPole(newPole); // 若需单独存储Pole数组,保留以下代码(可选) numPoles ++; poles[numPoles - 1] = newPole; sleep(3000); clear(); }
4. showHospital方法无需额外修改
因为getHospital()方法已经新增了关联Pole的展示逻辑,原showHospital循环调用getHospital()时会自动显示医院的科室信息。
内容的提问来源于stack exchange,提问作者José Filipe Silva
相关产品推荐
相关产品推荐

