Страницы

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

среда, 1 января 2020 г.

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

#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);

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

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