C'est quoi l'héritage ?
C'est quoi le polymorphisme ?

Imaginons qu'on veuille faire une collection de formes géométriques : carrés, cercles, triangles...

Quand vous avez un objet sous la main, vous voulez pouvoir le déplacer sans avoir besoin de savoir de quel type d'objet il s'agit.

Problème ! Tous les objets ont des attributs différents et ne se déplacent pas de la même façon:

classe Carré:
  attributs: couleur
             x1
             y1
             x2
             y2
  méthodes:
    déplace(dx,dy):
           x1 = x1 + dx
           y1 = y1 + dy
           x2 = x2 + dx
           y2 = y2 + dy
    changeCouleur(c):
           couleur = c
La classe Carré avec ses attributs et ses méthodes
classe Cercle:
  attributs: couleur
             x
             y
             rayon
  méthodes:
    déplace(dx,dy):
           x = x + dx
           y = y + dy
    changeCouleur(c):
           couleur = c
La classe Cercle avec ses attributs et ses méthodes

 

Chaque fois qu'on a un objet, il faut regarder si c'est un carré, un cercle ou un triangle et appeler la bonne méthode pour le déplacer. Ce n'est pas pratique !

En objet, on a une astuce : l'héritage.

Qu'on en commun les carrés, cercles et triangles ?
Ce sont tous des formes, ils possèdent tous une couleur et on peut tous les déplacer.
Créons une classe Forme plus générale:

classe Forme:
  attributs: couleur
  méthodes:
    déplace(dx,dy)
    changeCouleur(c):
           couleur = c
La classe Forme avec ses attributs et ses méthodes

Cela veut dire : toute Forme a une couleur et on peut la déplacer et changer sa couleur.

Maintenant on va dire que Carré et Cercle héritent (ou "dérivent") de Forme (un carré est une forme, un cercle est une forme, etc.).

(GIF 3 ko)

 

Nos classes deviennent:

classe Carré est une Forme:
  attributs: x1
             y1
             x2
             y2
  méthodes:
    déplace(dx,dy):
           x1 = x1 + dx
           y1 = y1 + dy
           x2 = x2 + dx
           y2 = y2 + dy
La classe Carré avec ses attributs et ses méthodes
classe Cercle est une Forme:
  attributs: x
             y
             rayon
  méthodes:
    déplace(dx,dy):
           x = x + dx
           y = y + dy
La classe Cercle avec ses attributs et ses méthodes

Comme vous le voyez, on a pas besoin de mettre l'attribut Couleur dans chaque classe : un cercle est une forme, or une forme a une couleur, donc un cercle a une couleur !

 

Pour les méthodes, c'est un peu différent:

changeCouleur: On change la couleur de toutes les formes de la même façon. C'est pour cela que c'est dans la classe Forme qu'on a programmé la méthode changeCouleur.
déplace: Dans la classe Forme, on a juste indiqué déplace(x,y) : cela signifie que tout objet héritant de Forme devra pouvoir être déplacée (sans dire comment).
Si vous crééez un nouvel objet qui hérite de Forme, vous devrez programmer une méthode déplace pour ce nouvel objet).

 

Maintenant on peut faire: X.déplacer(5,6)

Là, vous ne savez pas si X est un carré, un cercle ou un triangle. Mais vous pouvez déplacer la forme même si vous ne savez pas comment déplacer spécifiquement un carré, un cercle...

Quand vous appelez la méthode "déplacer", le système va regarder de quel objet il s'agit et appeler la bonne méthode "déplacer" : celle du carré si c'est un carré, celle du cercle si c'est un cercle...

(GIF 7 ko)

 

C'est ça le polymorphisme !

C'est très pratique. Par exemple vous voulez créer une liste de carrés, cercles, triangles, etc. Il suffit de créer un tableau de Formes:

Forme T[1...100]
(un tableau T de 100 Formes numérotées 1, 2... à 100).

Vous pouvez remplir ce tableau de carrés, cercles, triangles, etc. Ensuite pour déplacer (par exemple) la 5ième forme du tableau, faites T[5].déplacer(5,6).

Vous n'avez pas besoin de savoir de quelle forme il s'agit : vous vous contentez de la déplacer.

 



Tous ce que vous venez de voir constitue les fondements de la programmation objet (ou programmation orientée objet).

Sachez qu'il existe encore des tas de mécanismes supplémentaires qui permettent de faire encore plus de choses intéressantes.

Il existe différents langages objets: Effeil, SmallTalk, Delphi, C++, Java...

Je vous recommande particulièrement Java : c'est un langage très propre, bien conçu, gratuit, qui fonctionne sur toutes les machines et possède des tas de fonctions intéressantes (y compris en ce qui concerne la programmation objet).

Quelques exemples ?

Java est un excellent langage pour apprendre la programmation objet.

Le compilateur Java de Sun (le JDK) est gratuit. Vous pouvez le télécharger sur http://www.java.sun.com (le site est un peu labyrinthique, mais le JDK est là...).

Vous trouverez également des tonnes d'exemples, de cours et de documentation sur Java sur Yahoo: allez sur http://www.yahoo.com ou http://www.yahoo.fr et tapez "Java".

Si vous avez des difficultés, vous pouvez demander de l'aide sur les newsgroups : comp.lang.java.

Si lire l'anglais ne vous fait pas peur, je vous recommande l'excellent livre sur Java : "Thinking in Java" de Bruce Eckel (plus de 800 pages) : http://www.mindview.net/.
Vous pouvez consulter le livre en ligne ou le télécharger gratuitement au format PDF imprimable. Vous y découvrirez toutes les subtilités de la programmation objet et les raffinements que Java apporte (notemment par rapport au C++).

Pensez aussi au langage Python, qui s'apprend très rapidement et qui permet également de faire de la programmation objet.


Toutes ces pages et leur contenu (textes, images, sons, animations et toute autre forme de média) sont de par les lois françaises et internationales sur le droit d'auteur et la propriété intellectuelle protégées jusqu'à 70 ans après le décès de leur auteur, Sébastien SAUVAGE (alias MWPC2). Toute reproduction est interdite sans le visa de l'auteur. Toute personne morale ou physique portant atteinte à ces droits s'expose à des poursuites. Les images utilisées dans ces pages sont marquées électroniquement.
Merci de prévenir le Webmaster ([L'adresse email est une image]) de tout lien effectué vers ces pages.
h t t p : / / s e b s a u v a g e . n e t