Я считаю что нет. Кажется что то подобное было у Макконнелла: если нам нужно только поведение, мы работаем с интерфейсами. Если нам также нужны и данные, выбор за абстрактными классами.
Скажем, если будем использовать ссылку на интерфейс, то сможем получить доступ к объявленному по умолчанию члену. Но допустим нам не требуется этот функционал, в таком случае нам не нужна ни реализация, ни заглушка.
Да, толстые интерфейсы не есть хорошо, но невсегда расширение интерфейса приводит к размытию его ответсвенности. И в таком случае это все таки может быть полезным…
Допустим у вас есть некий интерфейс, который реализован несколькими класами. В какой то момент вы решили немного расширить интерфейс новым членом(скажем методом). До C# 8 пришлось бы в этих классах либо реализовывать этот новый член, либо ставить заглушку, но в любом случае изменения коснулись бы всех классов реализующих этот интерфейс. Теперь же достаточно добавить для этого нового члена реалицацию по умолчанию(«Default implementations»), не изменяя и не засоряя классы наследующие интерфейс.
Дело в том, что в C# не поддерживается множественное наследование классов. Возможно в этом причина широкого использования интерфейсов во всевозможных паттернах.
Мм… Возможно в классах такое поведение было бы удобным… Но опять же, для класса не всегда хотелось бы иметь все члены с одним модификатором. Допусим в классе с «областью» public мы хотим иметь некий вспомогательный приватный метод и тут выход таков, что бы указывать private явно перед таким методом, что так же вносит некий сумбур в код.
Ну как то так это должно выглядеть. И все нормально если каждый член имеет реализацию по умолчанию (каждый член будет иметь модификатор доступа интерфейса):
Вот только в случае с абстрактными членами возникает сумятится:
Каким должен быть модификатор доступа у «newMethod»?..
Как по мне это все вносит лишнюю сложность)