Подтвердить что ты не робот

Как добиться динамического полиморфизма без расширения класса

Меня спросили в интервью, как вы можете добиться динамического полиморфизма без расширения класса. Как это можно сделать?

4b9b3361

Ответ 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

Согласно моему опыту, в большинстве интервью с собеседованием вопросы не ищут слишком сложных ответов, и в большинстве случаев это просто сложные вопросы, поэтому, если они задают вопрос о полиморфизме без расширения класса, я бы сказал:

Да, вы можете иметь динамический полиморфизм, реализуя интерфейс, а не расширяя класс

то если они будут запрашивать больше опций, тогда было бы нормально отображать прокси, шаблоны или что-то еще.

Надеюсь, что это поможет!