Discussion:
Difference entre classe abstraite et interface
(trop ancien pour répondre)
comiland
2005-08-29 15:34:01 UTC
Permalink
BOnjour à 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 !

En vous remerciant par avance
Jean Marc
Jean-Marc Molina
2005-08-29 16:22:04 UTC
Permalink
Post by comiland
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 !
Tu aurais aussi du cross-poster ce message sur le groupe PHP...

Sinon une interface doit être implémentée et possède uniquement des méthodes
publics. Une classe abstraite est une classe, dont on peut hériter, qui ne
peut pas être instanciée. Mais il est vrai qu'en "bidouillant" on peut
parfaitement utiliser une classe abstraite comme interface, c'est ce qui est
fait en C++ par exemple.
--
Jean-Marc.
Loïc Joly
2005-08-29 17:40:19 UTC
Permalink
Post by Jean-Marc Molina
Post by comiland
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 !
Tu aurais aussi du cross-poster ce message sur le groupe PHP...
Sinon une interface doit être implémentée et possède uniquement des méthodes
publics. Une classe abstraite est une classe, dont on peut hériter, qui ne
peut pas être instanciée. Mais il est vrai qu'en "bidouillant" on peut
parfaitement utiliser une classe abstraite comme interface, c'est ce qui est
fait en C++ par exemple.
Une autre différence est que certains langages autorisent l'"héritage
multiple" (ou l'implémentation multiple, je ne sais plus trop le
vocabulaire utilisé pour les interfaces en Java ou C#) pour les
interfaces, mais pas pour les classes classiques.
--
Loïc
Michel Billaud
2005-09-03 09:07:31 UTC
Permalink
Post by Jean-Marc Molina
Post by comiland
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 !
Tu aurais aussi du cross-poster ce message sur le groupe PHP...
Sinon une interface doit être implémentée et possède uniquement des méthodes
publics. Une classe abstraite est une classe, dont on peut hériter, qui ne
peut pas être instanciée. Mais il est vrai qu'en "bidouillant" on peut
parfaitement utiliser une classe abstraite comme interface, c'est ce qui est
fait en C++ par exemple.
Autre chose : une classe abstraite peut proposer des implémentations de méthodes,
par exemple

function bouger($x,$y) {
$this->effacer();
$this->x = $x;
$this->y = $y;
$this->dessiner();
}

alors qu'une interface, non.
--
Michel BILLAUD ***@labri.fr
LABRI-Université Bordeaux I tel 05 4000 6922 / 05 5684 5792
351, cours de la Libération http://www.labri.fr/~billaud
33405 Talence (FRANCE)
Bruno Desthuilliers
2005-08-29 22:06:13 UTC
Permalink
Post by comiland
BOnjour à 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 comiland
En vous remerciant par avance
HTH
Miguel Moquillon
2005-09-01 09:09:41 UTC
Permalink
Post by comiland
BOnjour à 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 !
En gros, selon une représentation de Liskov du typage, dans un langage, une
interface représenterait le type d'un objet, tandis qu'une classe abstraite
serait une implémentation partielle d'un type.
Conceptuellement, pour un langage à typage statique qui ne supporterait que
l'héritage simple, le concept d'interface ou de protocole est un moyen de
contourner les limites de l'héritage simple tout en étant conforme au
typage selon Liskov.

Miguel
Continuer la lecture sur narkive:
Loading...