Страницы

Поиск по вопросам

вторник, 8 января 2019 г.

Каст абстрактного класса к конкретной реализации

Есть метод, возвращающий экземпляр абстрактного класса и перегруженные методы, которые принимают всех существующих наследников.
AbstractClass getSuccessor() { return ...; }
void work(SonOfAbstract child);
void work(DaughterOfAbstract child);
void work(GrandchildOfAbstract child);
Метод getSuccessor() гарантировано возвращает наследника AbstractClass и метод work умеет работать со всеми наследниками.
Но вот вызов work(getSuccessor()); ожидаемо не проходит , так как метод work(AbstractClass child) не определен. Для родителя и сферического наследника в вакууме работы нет.
Как можно передать наследника в метод, а JRE пускай само разбирается, какой метод вызывать?


Ответ

Можно метод work освободить от параметров если добавить его как абстрактный метод в AbstractClass. И затем имплементировать его для конкретного класса наследника. Это даёт возможность использовать абстрактный класс или интерфейс для хранения конкретной имплементации классов наследников и не привязывается к конкретному типу. Далее в зависимости от того какой конкретный тип будет использоваться вместо интерфейса в рантайме определится с помощью полиморфизма.
Этот метод не только освободит от привязки к типам, а также избавит от ненужных кастов. Проверка на тип с помощью instanceof а также вдобавок if else if как известно приводят к замедлению работы программы.

Комментариев нет:

Отправить комментарий