• [^] # Re: interface systématique ?

    Posté par . En réponse au journal Interfaces Orientées Objet PHP. Évalué à 5.

    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.