«Абстрактный класс» и «интерфейс» являются похожими понятиями, причем интерфейс является более абстрактным из двух. Одним из отличительных факторов является то, что абстрактные классы предоставляют реализации методов для производных классов, когда это необходимо. Однако в C # этот дифференцирующий фактор был уменьшен недавним введением методов расширения, которые позволяют предоставлять реализации для методов интерфейса. Другим отличительным фактором является то, что класс может наследовать только один абстрактный класс (т. Е. Множественное наследование отсутствует), но он может реализовывать несколько интерфейсов. Это делает интерфейсы менее строгими и более гибкими. Итак, когда в C # мы должны использовать абстрактные классы вместо интерфейсов с методами расширения?
Примечательным примером модели метода interface + extension является LINQ, где функциональность запросов предоставляется для любого типа, который реализуется с IEnumerable
помощью множества методов расширения.