Algo curioso sucede en Java cuando utiliza una clase abstracta para implementar una interfaz: algunos de los métodos de la interfaz pueden faltar por completo (es decir, no existe una declaración abstracta o una implementación real), pero el compilador no se queja.¿Por qué una clase abstracta que implementa una interfaz puede perder la declaración/implementación de uno de los métodos de la interfaz?
Por ejemplo, dada la interfaz:
public interface IAnything {
void m1();
void m2();
void m3();
}
la siguiente clase abstracta consigue alegremente compilado sin una advertencia o un error:
public abstract class AbstractThing implements IAnything {
public void m1() {}
public void m3() {}
}
¿Puede explicar por qué?
No se puede crear un objeto de una clase abstracta. Entonces, mientras no se proporcione una implementación para una clase abstracta, no se pueden crear objetos para IAnything. Así que esto está absolutamente bien para el compilador. El compilador espera que cualquier clase no abstracta que implemente IAnything debe implementar todos los métodos declarados de IAnything. Y como uno tiene que extender e implementar AbstractThing para poder crear objetos, el compilador arrojará un error, si esa implementación no implementa los métodos de IAnything que haya quedado fuera de AbstractThing. – VanagaS
¿PODEMOS LLAMAR ESO un "patrón de diseño del adaptador"? si mantuvimos m1, m2, m3 cuerpo vacío en clase abstracta. luego MyMainClass amplía esa clase abstracta y yo podría anular el método que desee, sin obligación de anular todos los métodos. ¡Por favor, avise! –