Зачем нужны интерфейсы при реализации внедрения зависимостей?
Изучаю Java и дошёл до темы внедрения зависимостей. Разобрался, что такое зависимость класса и что такое интерфейс. Однако не могут понять, зачем пользоваться интерфейсами при реализации внедрения зависимостей?
Допустим, есть класс A и класс Б. Чтобы избавиться от зависимости, в классе Б не создаётся объект на основе класса А. Конструктор принимает объект интерфейса. В свою очередь, класс А является реализацией этого интерфейса и в основной программе его объект отправляется как аргумент конструктора класса Б. Зачем тут нужен интерфейс? Не проще отправить сразу объект? Если избавиться от интерфейса, работает так же само.
Кратко, чтобы не зависит от реализации конкретного класса.
Условно говоря, чтобы накачать колесо, тебе не важно от какого оно авто, т.е. нужны только те параметры которые относятся к процессу накачивания, если все колеса реализуют эти параметры и методы нужны для накачивания, на них указанно давление и у них унифицирован ниппель, нет необходимости знать какое это конкретно колесо.
Передавая в класс объект, а не интерфейс, происходит привязка к конкретной реализации, это стимулирует программиста сильнее связать данные классы, чем необходимо, что усложнит дальнейшую разработку, это усложняет тестирование, ты не можешь подпихнуть в тест другую реализацию, это делает код менее универсальным и порождает дублирование, это усиливает связность кода, усложняя его последующую модификацию.
Да, вполне можно и без лишнего интерфейса, если у этого класса возможна только одна реализация.
Если класс реализует какую-то сложную логику или имеет сайд-эффекты, то для тестов будет проще внедрять его упрощённую версию без того кода - вот для этого и нужен интерфейс, чтобы можно было переопределить