Откуда классу с внедрённой зависимостью через интерфейс известно о классе, с которым реально надо работать?

Столкнулся с проблемой понимания внедрения зависимостей.

Допустим, есть интерфейс 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 шт):

Автор решения: Aziz Umarov

Как так получается, что класс с внедрённой зависимостью через интерфейс понимает, что надо работать не с интерфейсом, а объектом TaxCalculator2018, который этот самый интерфейс реализует?

никак не понимает (можно конечно явно преобразовать), в этом нет необходимости, вместо TaxCalculator2018 там может оказаться любой другой класс реализующий интерфейс.

Что это за механизм?

механизм Извлечение интерфейса

→ Ссылка