Как вызвать метод подкласса из класса, связанного с super - PullRequest
1 голос
/ 06 мая 2020

Представьте, что я создал два связанных класса (Building и Person). В здании могут разместиться n человек (человек), и человек может находиться в здании одновременно.

Код (только соответствующая его часть) пока что:

public class Building {
   //some attributes like name, location...
   private List<Person> person;

   //constructor
   //some methods
}


public class Person {
   //some attributes like name, age...
   private Building building;

   //constructor
   //some methods
}

Хорошо, теперь мне нужно получить более подробную информацию о Person, поэтому я расширяю этот класс на два других (Doctors и Parents), у которых есть свои собственные методы, некоторые из которых специфичны для каждого класса.

Код:

public class Parent extends Person {
     // some specific attributs
     public boolean born;
     //constructor
     //some methods
   public void setChildBorn() {
        this.born = true;
   }
}

public class Doctor extends Person {
    // some specific attributs
    // constructor
    // some methods
   public void maternityWard() {
      //HERE THE QUESTION
   }
}

Итак, как только я прибыл сюда, из метода maternityWard мне нужно было бы:

  1. Итерировать по массиву Person-ListArray здания, где находится Доктор (это нормально, есть способ получить их).
  2. Для тех объектов в ListArray, которые являются экземпляром Parent (я могу использовать instanceof Parent, поэтому здесь нет смысла), вызовите метод setChildBorn() .

Краткая схема будет такой:

Building < association > Person
                       / extends \ 
                    Doctor     Parent

И, наконец, вопрос: можно ли вызвать эксклюзивный метод в подклассе из другого подкласса? Если да, то каким будет этот код? Если это возможно, я считаю, что здесь есть кастинг, но я не уверен, как это сделать.

Заранее спасибо за вашу помощь.

Ответы [ 3 ]

1 голос
/ 06 мая 2020

Можно ли вызвать эксклюзивный метод в подклассе из другого подкласса?

Видимость эксклюзивного метода в других подклассах (т. Е. Родственных классах) такая же, как и в не -sibling, и он следует тому же контролю доступа , что и для любого класса non-sibling.

1 голос
/ 06 мая 2020

Вы можете сделать это с помощью оператора instanceof и приведения типов

public class Doctor extends Person {
    //..some code
    public void maternityWard() {
        for(Person p : building.getPersonList()){
            if(p instanceof Parent){
               Parent parent = (Parent)p;
               parent.setChildBorn();
            }
    }
}

PS Хотя это поможет вам вызвать метод Parent, но это плохая практика, хотя хорошо для понимания семантики и синтаксиса языка .

Несколько хороших практик разработки приложений

  1. модули с более высокой и низкой меткой должны зависеть только от абстракций. В зависимости от конкретного класса, а не от абстракций, вводится высокая степень сцепления. Приложение должно быть спроектировано так, чтобы обеспечить низкую связь и высокую связность между классами.
  2. Инкапсуляция (Сборка не должна предоставлять свое состояние напрямую для доступа и модификации, а должна предоставлять методы для обработки его состояния) instanceof и casting - это запах кода, избегайте их обоих.
1 голос
/ 06 мая 2020

Можно, но всегда есть риск получить ClassCastException, если в списке person был объект Doctor, а вы забыли использовать instanceof. Если нет, допустим, вы сохраняете Person в переменной с именем p. Затем для доступа к методу выполните:

((Parent) p).setChildBorn();
...