Las interfaces son para cuando quieres decir "No me importa cómo lo haces, pero esto es lo que debes hacer".
Las clases abstractas son para cuando quiere decir "Sé lo que debe hacer, y sé cómo debe hacerlo en algunos/muchos de los casos".
Las clases abstractas tienen algunos inconvenientes graves. Por ejemplo:
class House {
}
class Boat {
}
class HouseBoat extends /* Uh oh!! */ {
// don't get me started on Farmer's Insurance "Autoboathome" which is also a helicopter
}
Uno puede pasar por medio de una interfaz:
interface Liveable {
}
interface Floatable {
}
class HouseBoat implements Liveable, Floatable {
}
Ahora, las clases abstractas son también muy útiles. Por ejemplo, considere la clase AbstractCollection. Define el comportamiento predeterminado para métodos muy comunes para todas las colecciones, como isEmpty()
y contains(Object)
. Puede anular estos comportamientos si lo desea, pero ... ¿es muy probable que cambie el comportamiento para determinar si una colección está vacía? Por lo general, será size == 0
.
Y como no cambiará a menudo, ¿realmente vale la pena el tiempo del desarrollador para implementar ese método cada ... único ... tiempo ... para cada método en esa categoría "resuelta"? Por no mencionar cuando necesite hacer un cambio, tendrá duplicación de código y errores perdidos si tuviera que volver a implementarlo en todas partes.
Elija el idioma * uno *. Las respuestas correspondientes * podrían * ser muy diferentes. –
@Oli - entonces, ¿debo publicar una nueva pregunta? ¿Cómo OOP diferente en diferentes idiomas como java, php, .net :-) – zod
No, porque esa pregunta sería demasiado amplia. Las preguntas sobre SO deben ser * específicas *. –