"Clase abstracta" e "interfaz" son conceptos similares, siendo la interfaz el más abstracto de los 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 de diferenciación se ha reducido con la reciente introducción de métodos de extensión, que permiten proporcionar 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 deberíamos 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 implemente IEnumerable
a través de una multitud de métodos de extensión.