Dans le cas d'une interface, toutes méthodes qui sont définies dans une interface doit être mis en œuvre par une classe qui implémente.
Compte tenu de l'interface A
interface A {
public void foo();
}
et une classe B:
class B implements A {
}
il doit fournir une mise en oeuvre pour le procédé défini dans l'interface:
class B implements A {
@Override
public void foo() {
System.out.println("foo");
}
}
Sinon, il s'agit d'une erreur de compilation. Maintenant, prenez une classe abstraite avec une implémentation par défaut d'une méthode:
abstract class C {
public void bar() {
System.out.println("bar");
}
}
où une classe héritant de cette classe abstraite peut ressembler à ceci:
class D extends C { }
sans erreur. Mais il peut également remplacer l'implémentation de la méthode par défaut s'il est enclin à le faire. Ce que disait l'auteur: Si votre API n'est pas encore stable et que vous avez besoin d'adapter les interfaces (oui, les classes abstraites sont aussi des interfaces (en OOP-speak)), alors une classe abstraite vous permet d'ajouter des choses sans casser les classes qui sont déjà là. Cependant, cela ne vaut que pour les méthodes non abstraites. Si vous ajoutez des méthodes abstraites, elles doivent toujours être implémentées dans chaque classe dérivée. Mais tout de même, cela peut vous rendre la vie plus facile si vous avez une API qui est en constante évolution et déjà beaucoup de choses qui se construisent dessus.
Merci! Ce que je suis confus est cette déclaration - "casser les vieilles implémentations de la classe" dans le livre. "La classe" signifie que la classe dérive de la classe abstraite ou de la classe sur laquelle la classe abstraite est basée? – George2
@George: Cela signifie la classe dérivée de l'ancienne version de la classe interface/abstract. Avec les interfaces, il n'est plus valide car il ne parvient pas à implémenter une méthode que vous avez ajoutée à l'interface. Avec des classes abstraites et des méthodes non abstraites, il peut simplement utiliser la mise en œuvre de la classe de base sans même savoir qu'elle est là. – Joey
Merci! Vous voulez dire supposer dans la version 1, la classe abstraite a la méthode Foo et une classe dérive de la classe abstraite implémente Foo. Et dans la version 2 de la classe abstraite, une nouvelle méthode Goo est ajoutée, et la classe dérivée fonctionnera toujours sans être impactée (si Goo a une implémentation par défaut dans la classe abstraite)? – George2