Здравствуйте, karbofos42, Вы писали:
K>Применимы. Уровень абстракции достаточно условный и абстрактный класс в общем случае не обязан чем-то отличаться от интерфейсов.
Тот факт что у абстрактного класса может быть состояние уже меняет все. Как раз свести абстрактный класс к интерфейсу это не общий а частный случай.
K>Есть Stream и унаследованные от него MemoryStream, FileStream и какой-нибудь NetworkStream.
K>Много вот Stream знает про реализацию всего этого добра?
Не должен знать.
K>Метод расширения не является аналогом фичи по той причине, что он для всех реализаций интерфейса/наследников класса будет одинаковый,
K>а человекам нужно поведение по умолчанию с возможность перегрузки для конкретных реализаций.
Это от дизайна зависит можно использовать расширение или нет.
K>Было бы множественное наследование — думаю, что и фичу бы не добавляли, т.к. было бы доступно это всё через классы сделать.
Да не про множественное наследование эта фича.
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-8.0/default-interface-methods#motivation
Это про добавление методов без ломки совместимости.