Внедрение зависимостей вообще не имеет никакого отношения к интерфейсам.Проще говоря, он просто заявляет, внедряет проклятые зависимости во время выполнения, как вы хотите , не управляя встроенными зависимостями времени компиляции .
Это похоже на что-то подобное.Я покупаю автомобиль с двигателем, который хочу, не покупая автомобиль со встроенным двигателем (двигатель, который они хотят).Так что все дело в конфигурируемости создания объекта во время выполнения.
Так что совершенно неважно, внедряете ли вы тип параметра как интерфейс, абстрактный класс или даже конкретный класс.
Нов любом случае, хотя он не имеет никакого отношения к DI, если вы используете интерфейс или абстрактный класс вместо конкретного типа класса, вы можете ввести в свой код более обобщенное (посредством полиморфизма).