Как реализуется принцип открытости/закрытости в случае «ветвления» расширений в Java? Есть сущность, которую нужно расширять. Исходя из всех способов расширения, которые указываются в OCP, основной — наследование. Если эту сущность расширяют только в одном направлении, то всё нормально. Но если эту сущность нужно расширять в разных направлениях, как быть? В Java нет множественного наследования.
Пример: Есть класс — Человек.
Через некоторое время, этот класс захотят расширить по OCP — унаследуются, и сделают класс Бармен.
Но если потом класс Человек захотят расширить и в другом направлении? Например — класс Космонавт, также унаследованный от класса Человек. При этом, если нужно, чтобы Человек являлся одновременно и Космонавтом, и Барменом, это не получится из-за того, что Бармен и Космонавт уже будут требовать отдельные экземпляры (instances), что соответствует двум разным людям.

21 Авг 2019 в 07:03
188 +1
0
Ответы
1

Один из способов решения этой проблемы в Java — использование интерфейсов. Вы можете создать интерфейсы, например, "Работник" и "Космонавт", которые будут имплементироваться классом "Человек". При этом, классы "Бармен" и "Космонавт" могут реализовывать соответствующие интерфейсы. Таким образом, вы можете добавить новые функциональности к классу "Человек" без изменения его основной структуры.

Пример:

interface Работник {
public void работать();
}
interface Космонавт {
public void летать();
}
class Человек implements Работник, Космонавт {
@Override
public void работать() {
System.out.println("Человек работает");
}
@Override
public void летать() {
System.out.println("Человек летит в космос");
}
}
class Бармен implements Работник {
@Override
public void работать() {
System.out.println("Бармен работает");
}
}
class КосмонавтКосмонавт implements Космонавт {
@Override
public void летать() {
System.out.println("Космонавт летит в космос");
}
}
public class Main {
public static void main(String[] args) {
Человек chelovek = new Человек();
chelovek.работать();
chelovek.летать();
Бармен barman = new Бармен();
barman.работать();
Космонавт kosmonavt = new Космонавт();
kosmonavt.летать();
}
}

Таким образом, вы можете использовать интерфейсы для гибкого расширения класса "Человек" в разных направлениях, не нарушая принцип открытости/закрытости.

20 Апр в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 548 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир