Tu as tout à fait raison
Une classe abstraite est complétement équivalente à un interface Java.
La seule différence c'est que cette notion est explicitée en Java alors que tu dois parcourir la déclaration de la classe en c++ pour t'en apercevoir.
Sinon, c'est une bonne pratique de ne recourir que lorsque c'est nécessaire à l'héritage de classe et de lui préferer une approche basée sur l'héritage d'interface.
Ainsi plutôt que de faire hériter C de A et B, A et B étant des classes concrêtes, en java, on préfèrerera (ou plutôt on est contratint ce qui peut-être une bonne ou mauvaise chose) créer une classe C qui implémente des interfaces A et B.
Si on veut réutiliser du code, on créera une classe A' qui impléménte A uniquement et une classe B' qui impléménte B uniquement. On encapsulera (agregation) alors dans C une réference à un objet de la classe A2' et B' et on délègue chaque opération des interfaces A et B qu'on implemente à nos réferences de A' et B' encapsulées.
Le terme interface fait féreference à un comportement, un aspect d'une classe plutôt qu'à une entité autonome. Une classe c'est l'aggregation de comportement. C'est pourquoi
on utilise souvent un adjectif plutôt qu'un nom (IObservable, Serializable, ...)
Avec le c++ la tentation est grande de faire de l'héritage multiple mais en recourant à des classe abstraites on peut adopter la même approche.
C'est juste qu'il faut faire plus attention car la même notion (classe) sert à 2 concepts différents.
En quoi est-ce que le recours aux interface et à la délégation est une bonne pratique ?
- il permet une approche dynamique (un objet C peut prendre une nouvelle référence de la classe A'' qui implemente l'intreface A différement alors qu'eve l'héritage la liaison est statique?)
- il permet l'ajout de nouvelle caractéristiques sans modifier le code des classe terminales
-Il permet d'éviter l'explosion combinatoire des classes
si on a un A et B , A' et A'' spécialisent A, B' et B" spécialisent B.
Il faudra 4 classes dérivées de la classe C pour obtenir la combinaison de tous les comportements de A et B. Avec des interfaces et la composition, on a toujours qu'une seule classe C qui respectent les contrats de A et B et chaque instance est construite en fonction des besoins à l'execution.
[^] # Re: interface systématique ?
Posté par Bozo_le_clown . En réponse au journal Interfaces Orientées Objet PHP. Évalué à 5.
Une classe abstraite est complétement équivalente à un interface Java.
La seule différence c'est que cette notion est explicitée en Java alors que tu dois parcourir la déclaration de la classe en c++ pour t'en apercevoir.
Sinon, c'est une bonne pratique de ne recourir que lorsque c'est nécessaire à l'héritage de classe et de lui préferer une approche basée sur l'héritage d'interface.
Ainsi plutôt que de faire hériter C de A et B, A et B étant des classes concrêtes, en java, on préfèrerera (ou plutôt on est contratint ce qui peut-être une bonne ou mauvaise chose) créer une classe C qui implémente des interfaces A et B.
Si on veut réutiliser du code, on créera une classe A' qui impléménte A uniquement et une classe B' qui impléménte B uniquement. On encapsulera (agregation) alors dans C une réference à un objet de la classe A2' et B' et on délègue chaque opération des interfaces A et B qu'on implemente à nos réferences de A' et B' encapsulées.
Le terme interface fait féreference à un comportement, un aspect d'une classe plutôt qu'à une entité autonome. Une classe c'est l'aggregation de comportement. C'est pourquoi
on utilise souvent un adjectif plutôt qu'un nom (IObservable, Serializable, ...)
Avec le c++ la tentation est grande de faire de l'héritage multiple mais en recourant à des classe abstraites on peut adopter la même approche.
C'est juste qu'il faut faire plus attention car la même notion (classe) sert à 2 concepts différents.
En quoi est-ce que le recours aux interface et à la délégation est une bonne pratique ?
- il permet une approche dynamique (un objet C peut prendre une nouvelle référence de la classe A'' qui implemente l'intreface A différement alors qu'eve l'héritage la liaison est statique?)
- il permet l'ajout de nouvelle caractéristiques sans modifier le code des classe terminales
-Il permet d'éviter l'explosion combinatoire des classes
si on a un A et B , A' et A'' spécialisent A, B' et B" spécialisent B.
Il faudra 4 classes dérivées de la classe C pour obtenir la combinaison de tous les comportements de A et B. Avec des interfaces et la composition, on a toujours qu'une seule classe C qui respectent les contrats de A et B et chaque instance est construite en fonction des besoins à l'execution.