Héritage

Classes mères et classes filles en Java

Ce site ne sera plus alimenté de contenu après août 2014. Tous les nouveaux articles seront redigés pour www.waitingforcode.com

L'un d'autres principes de la programmation orientée objet (OOP) est l'héritage. En Java il ne se différencie pas énormémement de celui en PHP.

L'héritage en OOP ne diffère pas beaucoup de l'héritage génétique. Dans les deux cas on a une "mère" qui transmet des "attributs" à un ou plusieurs de ses filles. Cependant, jamais tous ces attributs sont identiques. Parfois par exemple la mère peut être blonde tandis que son enfant brun. En même temps elle peut manger avec la main droite tandis que sa fille avec la main gauche. L'héritage en OOP repose sur le même principe. Une classe "mère" délègue à une ou plusieurs classes "filles" les attributs et les méthodes. Cependant, la classe fille peut modifier la logique de ces méthodes :
- totalement eee: code totalement différent
- partiellement : exécution de la méthode du parent et ensuite un traitement supplémentaire, spécifique à la fille

Regardons cette spécificité sur un exemple mère - fille :

public class Inheritance {
    public static void main(String[] args) {
        Child childNoHand = new Child("#1");
        childNoHand.eat();
        Child childWithHand = new Child("#2");
        childWithHand.setHand("left");
        childWithHand.eat();
    }
}

class Mother {
    protected String name;
    protected String hand;

    protected void eat() {
        if (hand.equals("left")) {
            System.out.println(name + " : Move fork to left side");
        }
        System.out.println(name + " : Start to eat");
    }
}

class Child extends Mother {
    public Child(String n) {
        name = n;
      }
  
    protected void setHand(String h) {
        hand = h;
    }

    protected void eat() {
        if (hand == null) {
          System.out.println(name + " : before continue, please give the hand name");
        } else {
          super.eat();
        }
    }
}

Voici le résultat :

#1 : before continue, please give the hand name
#2 : Move fork to left side
#2 : Start to eat

On voit clairement l'exemple d'une méthode eat() qui hérite partiellement de la mère.

Deux types d'héritage existent en Java :
- is-a : repose sur l'un des mots-clés extends ou implements et veut dire qu'une classe est une autre. Si l'on se réfère à l'exemple ci-dessus, on peut le traduire en "la classe Child est une sous-classe de la classe Mother".
- has-a : ressemble à une injection des dépendances. Une classe n'hérite pas d'une autre classe directement mais via une méthode. L'objet hérité est alors réduit à un attribut de la classe héritante. On pourrait comprendre cela grâce à cet exemple :

public class InheritanceHasA {
    public static void main(String[] args) {
        Child child = new Child("#1");
        child.eat();
        child.setHand("left");
        child.setMother(new Mother("#M1", child.getHand()));
        child.eat();
    }
}

class Mother {
    protected String name;
    protected String hand;
  
    public Mother(String n, String h) {
        name = n;
        hand = h;
    }
  
    protected void eat() {
        if (hand.equals("left")) {
            System.out.println(name + " : Move fork to left side");
        }
        System.out.println(name + " : Start to eat");
    }
}

class Child {
    protected String name;
    protected String hand;
    protected Mother mother;
  
    public Child(String n) {
        name = n;
    }
  
    public void setMother(Mother m) {
        mother = m;
    }
  
    public void setHand(String h) {
        hand = h;
    }
  
    public String getHand() {
        return hand;
    }
  
    public void eat() {
        if (hand == null) {
            System.out.println(name + " : before continue, please give the hand name");
        } else {
            mother.eat();
        }
    }
}

Voici le résultat :

#1 : before continue, please give the hand name
#M1 : Move fork to left side
#M1 : Start to eat

On peut donc dire que la classe Child a une relation avec la classe Mother grâce à l'attribut protégé de cette prémière classe, mother.

Une question ? Une remarque ?

*

*

Un conseil JavaScript

Comment accéder aux éléments du parent avec jQuery ?

jQuery, le célèbre framework JavaScript, permet d'écrire moins et de faire plus. On pourrait s'imaginer que cela s'applique uniquement aux opérations basiques, limitées au sein d'un seul document / d'une seule fenêtre. Cependant, avec jQuery on peut aussi manipuler les éléments d'une fenêtre-enfant. Ces opérations se limitent à la précision qu'il s'agit du document parent. Supposons qu'on ouvre une popup et qu'on veut récupérer les informations appartenant aux div avec l'identifiant "CONTENT" situé dans le document parent. Pour ce faire, il suffit de préciser qu'il s'agit du document supérieur :

$('#CONTENT', window.parent.document).html();