Héritage (informatique)

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher
Page d'aide sur l'homonymie Pour les articles homonymes, voir Héritage.

L’héritage est un concept puissant de la programmation orientée objet, permettant entre autres la réutilisabilité (décomposition du système en composants) et l'adaptabilité des objets grâce au polymorphisme. Elle se nomme ainsi car le principe est en quelque sorte le même que celui d’un arbre généalogique. Ce principe est basé sur des classes dont les « filles » héritent des caractéristiques de leur(s) « mère(s) ».

Chaque classe possède des caractéristiques (attributs et méthodes) qui lui sont propres. Lorsqu'une classe fille hérite d'une classe mère, elle peut alors utiliser ses caractéristiques.

  • Si la classe mère est abstraite (retardée) il y a de forte chance qu'elle présente des caractéristiques abstraites (retardées). Pour être effective (instanciable), la classe fille doit alors les définir, sinon elle sera elle-même abstraite.
  • Si la classe mère est effective (toutes les caractéristiques sont définies) alors la classe fille est également effective. Il est possible d'y ajouter des caractéristiques, d'utiliser les caractéristiques héritées (appartenant aux parents) et de redéfinir les méthodes héritées. Généralement cette redéfinition se fait par surcharge sémantique (on déclare de nouveau la méthode avec le même nom et la même signature).
Exemple basique de diagramme UML représentant une relation d'héritage

Pour qu'une classe fille puisse hériter des propriétés de la classe mère, il faut que les propriétés de la classe mère possèdent des attributs de visibilité compatibles. Il existe dans la plupart des langages trois niveaux de visibilité :

  • Public est la visibilité la plus large (accessible directement en dehors de la classe)
  • Private est la plus restrictive (accessible uniquement depuis la classe courante)
  • Protected est intermédiaire et est visible par la classe courante, toutes les classes filles, mais inaccessible en dehors des classes mère/filles.

Propriétés de la notion d'héritage[modifier | modifier le code]

Il s'agit d'une relation :

  • Transitivité : si B hérite de A et si C hérite de B alors C hérite de A ;
  • Non réflexif : une classe ne peut hériter d’elle-même ;
  • Non symétrique : si A hérite de B, B n’hérite pas de A ;
  • Sans cycle : Il n'est pas possible que B hérite de A, C hérite de B et que A hérite de C.

Exemples[modifier | modifier le code]

PHP[modifier | modifier le code]

// ============================
// Déclaration des classes.   
// ============================
 
// ------------------------------
// Classe abstraite Animal.
// ------------------------------
class abstract Animal {
//attributs
   /**
    * @var string   Donnée membre
    */
   public $name;
 
//accesseurs
   /**
    * @return string   animal name
    */
   public function name() {
      return $this->name;
   }
 
//Constructeurs
   /**
    * @param string   animal name
    */
   public function __construct($name) {
      $this->name = $name
   }
 
//Modificateurs
   /**
    * @param string   animal name
    */
   public function setName($name) {
      $this->name = $name
   }
 
//Méthodes
   public abstract function crier();
}
 
// ------------------------------
// Classe Chat dérivée de Animal.
// ------------------------------
class Chat extends Animal {
//definition de la methode abstraite crier
   public function crier(){
      $this->miauler();
   }
 
//méthodes propres à Chat
   public function miauler() {
      echo 'miaou';
   }
}
 
// ------------------------------
// Classe Chien dérivée de Animal.
// ------------------------------
class Chien extends Animal {
//definition de la methode abstraite crier
   public function crier() {
      $this->aboyer();
   }
 
//méthodes propres à Chien
   public function aboyer() {
      echo 'ouf';
   }
}
 
// ============================
// Utilisation des classes.
// ============================
// Instanciation de la classe chien (toutou devient un objet de type chien).
$toutou = new Chien('Rex');
 
// -----------------------------------------------------------------------------
// On envoie un message au chien en utilisant une de ses méthodes (ici aboyer).
// -----------------------------------------------------------------------------
// Méthode de la classe Chien
$toutou->aboyer();
 
// Méthode héritée de la classe parente Animal
$toutou->setName('Isidor');

Java[modifier | modifier le code]

import static System.out. *;
// ==============================
// Déclaration des classes.
// ==============================
 
// ------------------------------
// Classe abstraite Animal.
// ------------------------------
public abstract Animal {
   /**
    * @var string   Donnée membre
    */
   public String name;
 
//accesseurs
   /**
    * @return string   animal name
    */
   public String getName() {
      return name;
   }
 
//Constructeurs
   /**
    * @param string   animal name
    */
   public Animal(String name) {
      this.name = name
   }
 
//Modificateurs
   /**
    * @param string   animal name
    */
   public void setName(String name) {
      this.name = name
   }
 
 
// Définition de la méthode abstraite crier
   public abstract void crier();
}
 
// ------------------------------
// Classe Chat dérivée de Animal.
// ------------------------------
public class Chat extends Animal{ 
//Méthode redéfinit
   @Override
   public void crier() {
      miauler();
   }
 
//Méthode
   public void miauler() {
      out.println("miaou");
   }
}
 
// ------------------------------
// Classe Chien dérivée de Animal.
// ------------------------------
public class Chien extends Animal{
//Méthode redéfinit
   @Override
   public void crier() {
      aboyer();
   }
 
//Méthode
   public void aboyer() {
      out.println("ouf");
   }
}
 
// ==============================
// Utilisation des classes
// ==============================
// Instanciation de la classe chien (toutou devient un objet de type chien).
Chien toutou = new Chien("Rex");
 
// --------------------------------------------------------------------------
// On envoie un message au chien en utilisant une de ses méthodes (ici aboyer)
// --------------------------------------------------------------------------
// Méthode aboyer de la classe chien.
toutou.aboyer();
 
// Appel d'une méthode héritée de la classe mère.
toutou.setName("Isidor");

Eiffel[modifier | modifier le code]

-- ======================================
-- Déclaration des classes
-- ======================================
-- --------------------------------------
-- Classe abstraite ANIMAL.
-- --------------------------------------
deferred class
   ANIMAL
 
create -- constructeur
   set_name
 
feature -- Access
 
   name: STRING
         -- Donnée membre
 
feature -- Change
 
   set_name (a_name: STRING)
         -- Set the animal name with 'a_name'.
      do
         name := a_name
      ensure
         name_effect: name = a_name
      end
 
feature -- Other
 
   crier
         -- Print the animal cry.
      deferred
      end
 
end
 
-- --------------------------------------
-- Classe CHAT dérivée de ANIMAL.
-- --------------------------------------
class 
   CHAT
 
inherit
   ANIMAL
      rename
         crier as miauler
      end
 
create
   set_name
 
feature -- Other
 
   miauler
         -- Print the animal cry.
      do
         print ("miaou")
      end
 
end
 
-- --------------------------------------
-- Classe CHIEN dérivée de ANIMAL.
-- --------------------------------------
class 
   CHIEN
 
inherit
   ANIMAL
      rename
         crier as aboyer
      end
 
create
   set_name
 
feature -- Other
 
   aboyer
         -- Print the animal cry.
      do
         print ("ouf")
      end
 
end
 
-- ======================================
-- Utilisation des classes
-- ======================================
main
   local
      -- Instanciation de la classe CHIEN (toutou devient un objet de type CHIEN).
      toutou: CHIEN
   do
      create toutou.set_name ("Rex")
 
      -- --------------------------------------
      -- Méthode aboyer de la classe CHIEN.
      -- --------------------------------------
      toutou.aboyer 
      toutou.set_name ("Isidor")
   end

Voir aussi[modifier | modifier le code]

Modèle:Palette programmation informatique