En el caso de una interfaz, todos métodos que se definen en una interfaz deben ser implementadas por una clase que implementa.
Dada la interfaz A
interface A {
public void foo();
}
y una clase B:
class B implements A {
}
que tiene que proporcionar una implementación para el método definido en la interfaz:
class B implements A {
@Override
public void foo() {
System.out.println("foo");
}
}
De lo contrario, es un error en tiempo de compilación. Desde aquí, tomar una clase abstracta con una implementación por defecto de un método:
abstract class C {
public void bar() {
System.out.println("bar");
}
}
donde una clase que hereda de esta clase abstracta puede tener este aspecto:
class D extends C { }
sin un error. Pero también puede anular la implementación del método predeterminado si está inclinado a hacerlo.
Lo que el autor decía allí: Si su API todavía no es estable y necesita adaptar interfaces (sí, las clases abstractas también son interfaces (en OOP-speak)), una clase abstracta le permite agregar cosas sin romper las clases que ya están allí. Sin embargo, esto solo es válido para los métodos no abstractos. Si agrega métodos abstractos, aún deben implementarse en todas las clases derivadas. Pero aún así, puede hacerte la vida más fácil si tienes una API que todavía está evolucionando y ya tiene muchas cosas desarrolladas.
¡Gracias! Lo que estoy confundiendo es esta afirmación: "romper implementaciones antiguas de la clase" en el libro. "La clase" significa que la clase se deriva de la clase abstracta, o clase en que se basa la clase abstracta? – George2
@George: Significa la clase que se deriva de la versión anterior de la clase interface/abstract. Con las interfaces ya no es válido, ya que no implementa un método que ha agregado a la interfaz. Con clases abstractas y métodos no abstractos, puede simplemente utilizar la implementación de la clase base sin siquiera saber que está allí. – Joey
Gracias! Quiere decir supongamos que en la versión 1, la clase abstracta tiene el método Foo y una clase deriva de la clase abstracta implementa Foo. Y en la versión 2 de la clase abstracta, se agrega un nuevo método Goo, y la clase derivada seguirá funcionando sin ser impactada (si Goo tiene implementación predeterminada en la clase abstracta)? – George2