· Tech watch

Quelle différence entre une classe abstraite et une interface ?

Apparues avec PHP 5, les classes abtraites (abstract classes) et autres interfaces mettent du temps à s’imposer au sein de la communauté des développeurs PHP. Largement répandues dans les mondes Java et .NET, ces deux notions constituent l’un des fondements de la programmation orientée objet (Object oriented programming). Si leur utilisation n’est pas particulièrement souhaitable pour générer de simples pages web dynamiques, en revanche, lorsqu’il s’agit de construire de véritables applications métier, aucune hésitation n’est permise – mais encore faut-il avoir compris leur utilité !

Les classes abstraites

Une classe abstraite est une classe dont toutes les méthodes n’ont pas été implémentées. Elle n’est donc pas instanciable, mais sert avant tout à factoriser du code. Une classe qui hérite d’une classe abstraite doit obligatoirement implémenter les méthodes manquantes (qui ont été elles-mêmes déclarées « abstraites » dans la classe parente). En revanche, elle n’est pas obligée de réimplémenter les méthodes déjà implémentées dans la classe parente (d’où une maintenance du code plus facile).

Les interfaces

Une interface est un peu comme une classe abstraite dans laquelle aucune méthode ne serait implémentée : les méthodes y sont seulement déclarées. Cela permet de définir un ensemble de services visibles depuis l’extérieur (l’API : Application Programming Interface), sans se préoccuper de la façon dont ces services seront réellement implémentés. Une classe qui implémente une interface doit obligatoirement implémenter chacune des méthodes déclarées dans l’interface, à moins qu’elle ne soit elle-même déclarée… abstraite !

Classe abstraite ou interface ?

Classes abtraites et interfaces ont chacune une fonction bien distincte : les classes abstraites servent à factoriser du code, tandis que les interfaces servent à définir des contrats de service. Et pourquoi ne pas utiliser des classes abstraites (dans lesquelles aucune méthode ne serait implémentée) en lieu et place des interfaces ? La réponse est simple : dans la plupart des langages actuels (c’est notamment le cas de Java, C#, PHP), il n’est possible pour une classe d’hériter que d’une seule classe parente (abstraite ou non), mais d’implémenter plusieurs interfaces.

Pour aller plus loin

16 commentaires

  1. salut jean,
    En lisant ton article, je me suis arrête sur une phrase qui n’est pas tout à fait juste.
    Une classe abstraite est une classe dont toutes les méthodes n’ont pas été implémentées
    En effet, une classe abstraite peut contenir, et des méthodes implémentées, et des signatures de méthodes.
    C’est d’ailleur la grande différence avec les interfaces ; qui elles ne peut contenir que des signatures de méthodes.

  2. je pense que la formulation « Une classe abstraite est une classe dont toutes les méthodes n’ont pas été implémentées. » est correcte. Cela signifie bien qu’il y a au moins une méthode qui n’a pas été implémentée.

  3. merci pour celle correction walid

  4. Walid, loin de moi l’idée de troller, mais je crois que tu as mal lu :
    «Une classe abstraite est une classe dont toutes les méthodes n’ont pas été implémentées.»
    ne veut pas dire :
    «Une classe abstraite est une classe dont aucunes méthodes n’est implémentées.»

    «En effet, une classe abstraite peut contenir, et des méthodes implémentées.»

    C’est ce que vous dites tous les deux. Jean et toi.

  5. Henri NDIAYE

    Je suis parfaitement d’accord avec Walid.
    Exemple :

    abstract class A{
       public int n ; // attribut
       ...
       void f(){.....} // ici, f est definie
       abstract void g(); // dans ce cas, g est non definie

  6. Walid la phrase que tu reprends signifie exactement ce que tu dis.
    Une classe abstraite est une classe dont toutes les méthodes n’ont pas été implémentées signifie qu’il y a certaines méthodes (pas toutes) qui n’ont pas d’implémentation, cela veut donc dire que cette classe contient des méthodes implémentées et des méthodes non implémentées …

  7. Ah oui ! L’auteur a bien raison !
    « Toutes les méthodes n’ont pas été implémentées » signifie juste qu’il existe au moins une méthode non implémentée !

    A ne pas confondre avec aucune méthode de la classe abstraite n’est implémentée !
    Merci

  8. @walid
    la phrase de l’auteur dit que:
    « Une classe abstraite est une classe dont toutes les méthodes n’ont pas été implémentées »
    sa négation est:
    « Une classe qui n’est pas abstraite est une classe dont toutes les méthodes ont été implémentées »

    donc je pense que la formulation de jean est correcte

  9. une classe abstraite est une classe dans la définition est procéder par le mot << abstract >> , si une classe possède un ou plusieurs méthodes abstraites doit être déclarer abstraite et le réciproque n’est pas vrai.
    une classe abstraite ne peut jamais être instancier avec l’opérateur new pour créer un objet
    on peut déclarer des variables de types de la classe abstraite
    une classe héritant d’une classe abstraite doit donne une implémentation à tout les méthodes abstraite de sa super classe si non elle doit être déclarer abstraite

  10. Ben moi j’ai rien compris
    c’est du delire votre truc !!!

  11. Agent de sécurité

    Comme tout le monde je vais troller un peu…
    Aucun commentaire ne sert vraiment ! Le premier est un aveu de non compréhension du français alors que le deuxième vient le rappeler à l’ordre…

    Les autres commentaires c’est du pure troll !

  12. Merci pour cet article très clair qui m’a permis de bien comprendre l’utilité et l’utilisation de ces deux types de classes.

  13. Je suis d’avis que dire :

    « Une classe abstraite est une classe dont toutes les méthodes n’ont pas été implémentées »

    est exactement la même chose que de dire :

    « Une classe abstraite est une classe dont aucune méthode n’est implémentée »

  14. La phrase « Une classe abstraite est une classe dont toutes les méthodes n’ont pas été implémentées » st correcte.
    Cependant, elle peut porter a confusion.

    Ça serait mieux s’il était possible de l’écrire d’une manière plus claire et simple. Le but n’est pas juste de donner les bonnes informations mais aussi (et surtout?) être pédagogue.

    je propose:
    « Une classe abstraite est une classe dont au moins une méthode n’est pas implémentée »

  15. Je continue le débat :
    « Une classe abstraite est une classe dont toutes les méthodes n’ont pas été implémentées »

    Je pense que la phrase exacte est :
    « Une classe abstraite est une classe dont les méthodes n’ont pas toutes été implémentées»

    Comme ça il n’y a pas de doute dans l’interprétation de la phrase.

  16. Toutes les méthodes non implémentées veut dire que pas toutes les méthodes ou autrement dit: si au moins une méthodes qui n’est pas implémentée.

Les commentaires sont désormais fermés.