Б>>Когда имеется несколько реализация — понятно, интерфейс обычно выделяют. Б>>Но если реализация только одна, для каких классов выделяете интерфейсы, а для каких нет?
САД>Выделяется при любом взаимодействии двух и более классов, ибо тесты.
За такое гореть в аду, фреймворки давно уже умеют мокать классы, если даже таких нет, можно дописать велосипедов самостоятельно, но при этом контракттипа не раздувая.
Б>>Но если реализация только одна, для каких классов выделяете интерфейсы, а для каких нет?
Когда обращение должно быть по интерфейсу, вместа типа. Например класс внутренняя реализация модуля (internal) создает этот тип какой-то провайдер и необходимо оставить реализацию типа внутри билиотеки, либо может внутри какого-то namespace (физически нельзя запретить, но соглашением можно)