Откуда классу с внедрённой зависимостью через интерфейс известно о классе, с которым реально надо работать?
Столкнулся с проблемой понимания внедрения зависимостей.
Допустим, есть интерфейс TaxCalculator с методом double calculateTax(). Данный метод реализуется классом TaxCalculator2018.
Внедрение зависимости осуществляется через конструктор класса TaxReport. В классе есть приватная переменная private TaxCalculator calculator (переменная с типом интерфейса). Переменную с таким же типом принимает конструктор - public TaxReport(TaxCalculator calculator){...}
Наконец, в основном классе есть такой код.
TaxCalculator2018 calculator = new TaxCalculator2018(100_000);
TaxReport report = new TaxReport(calculator);
В конечном итоге в calculator попадает ссылка на объект TaxCalculator2018, после чего отправляется в конструктор класса TaxReport. Между тем, конструктор класса TaxReport должен принимать объект с типом TaxCalculator, то есть интерфейс.
Как так получается, что класс с внедрённой зависимостью через интерфейс понимает, что надо работать не с интерфейсом, а объектом TaxCalculator2018, который этот самый интерфейс реализует? Что это за механизм? Нет ли подробной статьи с объяснением?
Ответы (1 шт):
Как так получается, что класс с внедрённой зависимостью через интерфейс понимает, что надо работать не с интерфейсом, а объектом TaxCalculator2018, который этот самый интерфейс реализует?
никак не понимает (можно конечно явно преобразовать), в этом нет необходимости, вместо TaxCalculator2018 там может оказаться любой другой класс реализующий интерфейс.
Что это за механизм?
механизм Извлечение интерфейса