Classes abstraites / interfaces, les différences ?

Eléphant du PHP | 97 Messages

10 sept. 2007, 02:49

Bonjour en lisant le chapitre consacré à la POO dans PHP5avancé, il y a une chose que j'ai du mal
à integrer, ce sont les différences entre "classes abstraites" et "interfaces", en effet j'ai l'impression
que la finalité est la même. Si quelqu'un pouvait m'expliquer par un exemple de code ou autre les différences de ces deux concepts je lui serais trés reconnaissant. :)

ViPHP
ViPHP | 5924 Messages

10 sept. 2007, 03:15

Le principe des interfaces, c'est que ce sont des templates auxquels doivent correspondre les classes qui implémentent ces templates. On dit d'ailleurs bien implémenter, c'est à dire que le template définit une liste de méthodes et attributs que la classe qui l'implémente doit avoir pour pouvoir être déclarée comme implémentant cette interface. D'ailleurs, on peut implémenter plusieures interfaces.

Quant aux classes abstraites, ce sont des classes "non finies", c'est à dire que le développeur a créé une classe avec une liste de méthodes et attributs dans sa classe, mais il en a laissé certaines non implémentées, ce qui signifie que n'importe qui peut reprendre le travail s'il complète cette classe. C'est pour cela d'ailleurs qu'une classe abstraite ne peut pas être instanciée, car elle n'est pas achevée, et seule une classe fille non abstraite peut l'être. Les classes abstraites sont donc destinées à être héritées de manière à faire bénéficier à plusieurs classes d'un travail commun, réuni dans une seul classe, non complète. Et on ne peut hériter que d'une classe, qu'elle soit abstraite ou non.

Après, c'est vrai qu'à l'origine, c'était la même choses, en gros les interfaces ont été introduites par java pour copier l'héritage du C++. Seulement C++ supporte l'héritage multiple (de plusieurs classes), et java ne voulait pas implémenter cette fonctionnalité qui semblait trop lourde pour les développeurs de chez sun. Mais ceci posait un problème si l'on voulait qu'une classe obéisse à plusieurs shémas de classe. Les interfaces ont donc étées inventées, pour résoudre le problème, car la gestion de l'implémentation multiple de plusieurs interfaces et beaucoup plus simple à gérer qu'un héritage multiple. Donc en définitive, on pourraît dire que les interfaces sont des classes entièrement abstraites et héritables de manière multiples, même si un développeur de chez sun vous jurera le contraire :mrgreen:

Eléphant du PHP | 97 Messages

10 sept. 2007, 03:59

Eh bien voilà qui est trés clair, merci sekiltoyai !!
Je vais devier un peu du sujet , mais y'aurait il des sites présentant des classes pas trop complexes
pour que je puisse me familiariser d'avantage à des cas concrets d'utilisation de la POO avec PHP5 ?

Eléphanteau du PHP | 39 Messages

11 sept. 2007, 04:41

salut,

je suis dans le même cas que toi Shadockou. Même si j'ai compris le concepte je manque d'exemple pour bien l'assimiler.
Donc si vous avez des exemples d'implémentation simple nous sommes preneur :D

Par avance merci.

Mammouth du PHP | 843 Messages

11 sept. 2007, 09:28

Salut vous deux :)
Je suis également dans le même cas que vous...

je vous conseil de faire des recherche dans les divers script et framworks existant ;)
La lecture des codes sources de differentes applications vous ferra decouvrir une multitude d'exemple d'utilisation ;)

sinon chercher sur google avec des recherches du genre: "classe mysql php5".

@++ :)
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

11 sept. 2007, 12:15

Je voudrais quand même faire une petite précision quand Sékiltoyai dit qu'il s'agit de classes "non finies", il s'agit de classes volontairement incomplètes afin de forcer celles qui vont en hériter à implémenter le comportement prévu.

L'intérêt est principallement pour un travail collaboratif - ou pour s'imposer des règles - afin d'être sur que toutes les classes héritantes respecteront les normes définies dans la classe parente.

Supposons par exemple que je crée la classe "Vehicule" avec une méthode getNombreRoues().
Si quelqu'un souhaite créer la classe "Voiture" qui hérite de la mienne, il sera obligé de re-déclarer la méthode getNombreRoues() et de l'implémenter pour qu'elle retourne 4. Idem pour la classe "Moto" qui quant à elle devra retourner 2.

Ainsi dans le reste de mon application, je peux sereinement appeller cette méthode quel que soit l'objet qui aura été instancié, je serais certain que celle-ci aura été implémentée et retournera le résultat correspondant à l'objet. Je peux donc faire un code générique qui sera compatible pour tout les objets qui hériteront de ma classe abstraite.
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 97 Messages

11 sept. 2007, 19:05

Beroots et Callapa , pour l'instant j'ai trouvé ca :

http://www.phpcs.com/codes/CLASSE-PHP5- ... 34003.aspx

Déjà plus proche d'un cas pratique , il y a surement mieu en fouillant bien sur le site....

N'hesitez pas à poster ici vos liens ! :)

L'ideal ce serait d'avoir un exemple de projet avec la modelisation UML et le code en lui même,
(ou peut-etre se jeter à l'eau :lol: )

Eléphanteau du PHP | 39 Messages

12 sept. 2007, 13:34

Merci à tous pour vos réponses.

J'ai trouvé une petite explication supplémentaire aux votres http://www.clever-age.com/veille/blog/q ... rface.html