#java #ооп
Есть метод, возвращающий экземпляр абстрактного класса и перегруженные методы, которые принимают всех существующих наследников. AbstractClass getSuccessor() { return ...; } void work(SonOfAbstract child); void work(DaughterOfAbstract child); void work(GrandchildOfAbstract child); Метод getSuccessor() гарантировано возвращает наследника AbstractClass и метод work умеет работать со всеми наследниками. Но вот вызов work(getSuccessor()); ожидаемо не проходит , так как метод work(AbstractClass child) не определен. Для родителя и сферического наследника в вакууме работы нет. Как можно передать наследника в метод, а JRE пускай само разбирается, какой метод вызывать?
Ответы
Ответ 1
Можно метод work освободить от параметров если добавить его как абстрактный метод в AbstractClass. И затем имплементировать его для конкретного класса наследника. Это даёт возможность использовать абстрактный класс или интерфейс для хранения конкретной имплементации классов наследников и не привязывается к конкретному типу. Далее в зависимости от того какой конкретный тип будет использоваться вместо интерфейса в рантайме определится с помощью полиморфизма. Этот метод не только освободит от привязки к типам, а также избавит от ненужных кастов. Проверка на тип с помощью instanceof а также вдобавок if else if как известно приводят к замедлению работы программы.Ответ 2
Какая-то гниль в датском королевстве. AbstractClass item = getSuccessor(); if (item instanceof GrandchildOfAbstract) work((GrandchildOfAbstract)item); else if (item instanceof SonOfAbstract) work((SonOfAbstract)item); else if (item instanceof DaughterOfAbstract) work((DaughterOfAbstract)item);
Комментариев нет:
Отправить комментарий