Полиморфизм ArrayList в Java

У меня есть домашнее задание по системе управления больницей. Я в основном закончил, но у меня есть проблема с полиморфизмом. В моем проекте у меня есть 6 классов и 1 тестовый класс. Эти 6 классов: «Доктор», «Амбулаторный пациент», «Стационар», «Пациент» и «Человек». Класс Doctor и Patient расширяют класс Person, а класс In/Ampatient расширяет класс Patient. Мой учитель говорит, что у врача теперь есть только 1 список пациентов, в который можно добавить как стационарных, так и амбулаторных пациентов (полиморфизм). Этот список определяется в частном порядке. Таким образом, новые добавленные методы addPatient/removePatient будут использоваться для добавления/удаления пациентов в/из этого списка.

Как я могу это сделать? В каком классе я должен написать список массивов в / амбулаторно. Вот мой код

Доктор.java

public class Doctor extends Person{

    private int staffId;
    private double salary;

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

    public ArrayList<Inpatient> inpatients = new ArrayList<Inpatient>();
    public ArrayList<Outpatient> outpatients = new ArrayList<Outpatient>();
    ...
public void addPatient(Patient a) {
        JFrame j=new JFrame();

        for (int i = 0; i < patients.size(); i++) {
            if ( (patients.get(i)).getRegistrationId() == a.getRegistrationId()) {
                JOptionPane.showMessageDialog(j,"Patient already added before!");
                return;
            }
        }

        patients.add(a);
    }

    public void removePatient(int registrationId) {
        for (int i = 0; i < patients.size(); i++) {
            if (patients.get(i).getRegistrationId() == registrationId) {
                patients.remove(i);
            }
        }
    }

test.java

public static void main(String args[]){
   ... 
 Doctor d = new Doctor(111222, "ali", 50, "m", "ankara", 6000); //staffId, name, age, sex, address, salary
 h.addDoctor(d);
 Inpatient in = new Inpatient(333444, "veli", 32, "m", "istanbul", 345.40, 410);
 d.addPatient(in); //Inpatient in is registered to Doctor d.
 Outpatient out = new Outpatient(555666, "helin", 28, "f", "izmir", 610.35);
 d.addPatient(out); //Outpatient out is registered to Doctor d.

...
Этот список определяется в частном порядке. -- Все списки в вашем примере общедоступны.
Nicholas Kurian 19.05.2019 15:50

@NicholasK хорошо, я это исправлю.

user10186856 19.05.2019 15:54

Можете ли вы переформатировать свой вопрос? Что тебе необходимо сделать?

Golov Pavel 19.05.2019 15:54

@GolovPavel Я не могу понять, чего хочет учитель? У меня должен быть только один массив в классе врачей, но где должен быть врач в/амбулаторно?

user10186856 19.05.2019 15:58

Кроме того, в чем именно проблема? Ваши addPatient() и removePatient() выглядят отлично. Кроме того, вам нужен только один список patients (из-за полиморфизма).

Nicholas Kurian 19.05.2019 15:58
Мой учитель говорит, что у Доктора теперь есть только 1 список для Пациентов.: но ваш код имеет 3 отдельных списка. Сделайте то, что он сказал: удалите два других списка (которые в любом случае не используются в вашем коде)
JB Nizet 19.05.2019 16:01
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
348
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я думаю, что ваш учитель имел в виду, что вам вообще не нужны inpatients и outpatients списки. Когда вы создали список массивов patients, вы можете содержать там обоих пациентов, потому что они расширяют класс Patient.

поэтому, как сказал Павел, вам не нужны списки для InPatients и OutPatients, просто есть один для пациентов, а полиморфизм позаботится об обоих типах. В вашем коде вы все равно не используете списки, поэтому просто удалите объявление.

Кроме того, еще пара замечаний. Когда вы инициализируете дженерик, если ваш тип объявления и тип инициализации совпадают, вам не нужно упоминать тип во второй раз. Например, здесь:

List<String> names = new ArrayList<String>();

В этом случае второе упоминание «String» избыточно и может быть опущено.

Кроме того, не уверен, где вы находитесь со своим образованием в области Java, но по мере роста вашего списка вам потребуется все больше и больше времени, чтобы проверить, добавлен ли уже пациент. Таким образом, использование списка может быть не лучшей идеей. Я бы использовал карту, чтобы вы могли быстрее посмотреть, находится ли там пациент. То же самое касается удаления. Вам также больше не понадобятся петли. Надеюсь, это поможет!

Другие вопросы по теме