Принцип DIP: абстракции и композиция
Как гласит принцип DIP из SOLID:
Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
Следуя из этого определения, мне казалось, что любая зависимость должна быть через интерфейс или абстрактный класс.
В одном из ответов с SO, писали, что это не совсем так.
Но никакого пояснения и примеров небыло.
Хотелось,чтобы кто-то объяснил, в каких случаях необходимо при реализации деталей нужно оперировать интерфейсами и абстрактными классами, а в каких не имееь смысла.
И всегда ли нужно аргументы-зависимости указывать от интерфейса или абстрактного класса?
Если можно, с примера :)
И второй вопрос, связан с видом ассоциации - композицией, а именно: когда мы создаём объект внутри конструктора, но при этом не внедряем его - нарушает ли это принцип DIP? Т.к. у нас зависимость жёсткая. Также не зависит от абстракции.. и так же не понятно, как тестировать такой класс в котором есть композиция.. поясните пожалуйста, желательно с примерами.