Меня спросили в интервью, как вы можете добиться динамического полиморфизма без расширения класса. Как это можно сделать?
Как добиться динамического полиморфизма без расширения класса
Ответ 1
шаблон дизайна Decorator, который использует encapsulation это то, что вы ищете.
Полиморфизм через наследование:
class Cat {
void meow() {
// meow...
}
}
class Lion extends Cat {
}
Полиморфизм через инкапсуляцию (узор декоратора):
interface Cat {
void meow();
}
class Lion implements Cat {
private Cat cat;
void meow() {
this.cat.meow();
}
}
пс. Подробнее о декораторах: http://www.yegor256.com/2015/02/26/composable-decorators.html
Ответ 2
Простое решение - написать класс, реализующий интерфейс, а не расширение базового класса.
Другим решением является создание динамического прокси-сервера... который по сути является умным способом реализации интерфейса без явного написания класса. Подробнее см. Proxy
javadoc.
И да, это (или могут быть) примеры шаблона декоратора, хотя ключевая вещь здесь - это методы реализации, а не шаблон дизайна.
Ответ 3
Согласно моему опыту, в большинстве интервью с собеседованием вопросы не ищут слишком сложных ответов, и в большинстве случаев это просто сложные вопросы, поэтому, если они задают вопрос о полиморфизме без расширения класса, я бы сказал:
Да, вы можете иметь динамический полиморфизм, реализуя интерфейс, а не расширяя класс
то если они будут запрашивать больше опций, тогда было бы нормально отображать прокси, шаблоны или что-то еще.
Надеюсь, что это поможет!