Post by comilandBOnjour à vous !
Je débute en PHP5 et j'aimerais bien mieux comprendre les differences entre
une interface et une classe abstraite
POurriez vous m'expliquer les differences existentes entre
les deux !
L'interface d'un objet, c'est ce que ses clients peuvent en connaitre
(schématiquement: attributs et membres 'publics'). En Java (et en PHP5
dont le modèle est calqué sur celui de Java), on peut spécifier
explicitement et nommer une interface, qui définit donc un ensemble de
services qu'un objet qui implémente cette interface s'engage à fournir.
Une interface est donc, dans une certaine mesure, la spécification d'un
type abstrait, mais sans aucune implémentation.
Une classe abstraite est une classe partiellement implémentée, donc non
instanciable (ou en tous cas pas destinée à être instanciée). Les deux
utilisations courantes sont soit une classe 'racine' d'une hiérarchie
d'héritage, qui est ajouté après coup pour factoriser le code commun,
soit une classe d'un framework, qui doit être spécialisée par
l'application utilisant le framework.
Note que techniquement, une 'interface' (au sens Java) n'est guère plus
qu'une classe abstraite sans donnée membre et dont toutes les méthodes
sont abstraites. En C++, on utilise couramment cette construction là où
on utiliserais une interface en Java.
Dans les langages à typage dynamique (Python, Ruby, Smalltalk, PHP,
etc), les interfaces sont généralement implicite - on appelle ça "duck
typing" (if it walks like a duck and quake like a duck, it is a duck...
or close enough !-). De ce point de vue, c'est le code client qui
détermine (implicitement) l'interface attendue, et accepte n'importe
quel objet présentant cette interface.
C'est aussi, dans une certaine mesure, ce que font les systèmes de
typage par inférence (Caml, Haskell (si ma mémoire est bonne), ...), qui
'infèrent' un type abstrait à partir de l'utilisation qui est faite d'un
objet dans une fonction, puis vérifient que les objets passés à cette
fonction implémentent effectivement l'interface correspondante. Ceci
permet de combiner certains avantages du typage statique
(essentiellement en matière d'optimisations possibles, accessoirement en
ce qui concerne la correction du typage avant exécution) et (dans une
certaine mesure) la souplesse et la généricité du typage dynamique.
D'une manière générale - et particulièrement avec un langage à typage
statique (Java, C++, ...) - il est préférable d'écrire son code en
fonction d'une interface et non d'une implémentation. En découplant
l'interface (type abstrait) de l'implémentation (type concret), on gagne
en généricité, et le même code peut être client de toute classe
implémentant l'interface nécessaire, au lieu de ne pouvoir travailler
qu'avec des instances d'un type concret.
Post by comilandEn vous remerciant par avance
HTH