"Clase abstracta" e "interfaz" son conceptos similares, siendo la interfaz la más abstracta de las dos. Un factor diferenciador es que las clases abstractas proporcionan implementaciones de métodos para clases derivadas cuando es necesario. Sin embargo, en C #, este factor diferenciador se ha reducido por la reciente introducción de métodos de extensión, que permiten que se proporcionen implementaciones para los métodos de interfaz. Otro factor diferenciador es que una clase puede heredar solo una clase abstracta (es decir, no hay herencia múltiple), pero puede implementar múltiples interfaces. Esto hace que las interfaces sean menos restrictivas y más flexibles. Entonces, en C #, ¿cuándo debemos usar clases abstractas en lugar de interfaces con métodos de extensión?
Un ejemplo notable del modelo de interfaz + método de extensión es LINQ, donde se proporciona la funcionalidad de consulta para cualquier tipo que se implemente a IEnumerable
través de una multitud de métodos de extensión.