Usar interfaces cuando se esperan cambios frecuentes en el código. Interfaces es un método más flexible que herencia para manejar opciones de comportamiento. Una clase abstracta funciona de manera similar pero además permite definir comportamientos comunes, forzando a las subclases a definir los comportamientos especializados. Una clase abstracta se parece a una interface en que ambos son una especie de contrato de como se debe comportar la clase en el mundo exterior. Resumiendo; interfaces permite a una clase tener varios padres, pero una interface no implementa ningún método, solo especifica que métodos se deben implementar.
Una clase abstracta no se puede instanciar pero puede implementar algunos métodos ( o todos). Interfaces hacen oficial la separación entre implementación y la firma de una clase, mientras que una clase abstracta permite definir comportamiento común, pero por lo mismo es más fácil romper el código en cascada al hacer un cambio. La siguiente tabla compara interfaces y clases abstractas en C#
Interface | Abstract class |
Una clase puede heredar múltiples interfaces. | Una clase solo puede heredar de una clase abstracta. |
sin implementación por defecto. | Implementación por defecto. |
Solo Static final constants. | Constantes pueden ser estáticas y de instancia. |
La interface define las características periféricas de una clase. | Una clase abstracta define el comportamiento interno de una clase. |
Si las implementaciones solo se parecen en la firma, entonces es mejor usar interfaces. | Si las varias implementaciones usan comportamientos comunes, es mejor usar una clase abstracta. |
Ejecución Lenta. | Ejecución rápida. |
Es necesario revisar todas las implementaciones para agregar funcionalidad. | Se puede agregar el nuevo método a la clase abstracta y todas las implementaciones lo incorporan. |
http://www.javaworld.com/javaworld/javaqa/2001-04/03-qa-0420-abstract.html?page=1
http://www.codeproject.com/csharp/abstractsvsinterfaces.asp
C# Interface Based Development