¿Cuándo usar clases abstractas y cuándo usar interfaces?
Dado que una subclase solo puede extender una clase principal y puede implementar múltiples interfaces, las interfaces son más flexibles que las clases abstractas. Pero las interfaces no pueden contener métodos concretos, mientras que las clases abstractas sí. Para combinar las ventajas de ambas, puede crear una interfaz y una clase abstracta (clase de conveniencia) que implemente la interfaz y luego decidir qué interfaz usar caso por caso.
La inmutabilidad de la interfaz significa que no cambiará la forma en que se usa la interfaz, pero puede cambiar la implementación específica de la interfaz. La implementación de la interfaz es transparente para los usuarios. la implementación de la interfaz, siempre y cuando sepan que simplemente funciona cómo se usa la interfaz, por lo que la inmutabilidad de la interfaz brinda comodidad a los usuarios.
Lo mismo ocurre con las clases abstractas. La implementación interna se puede cambiar según sea necesario (como mejorar los algoritmos), pero los métodos proporcionados a los usuarios no deben cambiarse fácilmente.