< -->

mardi 15 mars 2011

Héritage en Java

le concept d’héritage constitue l’un des fondements de la programmation orientée objet. Il est notamment à l’origine des possibilités de réutilisation des composants logiciels que sont les classes. En effet, il permet de définir une nouvelle classe, dite classe fille (ou encore dérivée ou bien clientes), à partir d’une classe existante dite classe mère (ou classe de base).

Cette nouvelle classe hérite d’emblée des fonctionnalités de la classe de base (champs et méthodes) qu’elle pourra modifier et/ou compléter à volonté, sans qu’il soit nécessaire de remettre en question la classe de base ceci permet de raccourcir les temps d’écriture et de mise au point du code d’une application, il est intéressant de pouvoir réutiliser du code déjà écrit et d’éviter la duplication du code





  • Réutilisation par des classes clientes

Soit une classe A dont on a le code compilé,et supposant qu’une autre classe C veut réutiliser la classe A. Elle peut créer des instances de A et leur demander des services .On dit que la classe C est une classe cliente de la classe A
  • Réutilisation avec modifications

Souvent, on souhaite modifier en partie le comportement de A avant de le réutiliser ou, on aimerait ajouter une nouvelle fonctionnalité à A, une solution simple : modifications du code source, on peut copier, puis modifier le code source de A dans des classes A1, A2,…

Problèmes : on n'a pas toujours le code source de A,alors les améliorations futures du code de A ne seront pas dans les classes A1, A2,…

Solution : réutilisation par l’héritage

L’héritage existe dans tous les langages objet à classes,Cette technique offerte pour construire une classe à partir d’une (ou plusieurs) autre classe en partageant ses données et méthodes
L'héritage est un mécanisme aussi qui facilite la réutilisation du code et la gestion de son évolution.

L’héritage permet aussi d’écrire une classe B qui se comporte dans les grandes lignes comme la classe A mais avec quelques différences, sans toucher au code source de A,de plus le code source de B ne comporte que ce qui a changé par rapport au code de A,et la classe B qui hérite de la classe A s'appelle une classe fille (ou sous-classe ou encore dérivée ou bien clientes)
La classe A s'appelle une classe mère, (classe parente ou classe de base et parfois super-classe).


Règle générale :

pour mettre on oeuvre de l'héritage, on utilise le mot-clé extends pour indiquer qu'une classe hérite d'une autre

class Classe_Fille extends Classe_Mere {/* ... */}


Voici quelque exemple pour se familiariser avec le concept d’héritage

Exemple1 :

// classe de base
class Point{ 

private int x, y ;

public void initialise (int abs, int ord)
  { x = abs ; y = ord ; }

  public void deplace (int dx, int dy)
  { x += dx ; y += dy ; }

  public void affiche ()
  { System.out.println ("Je suis en " + x + " " + y) ; }
  
}
   // classe derivee de Point
class Pointcol extends Point{

private byte couleur ;

public void colore (byte couleur)
  { this.couleur = couleur ;}
  
}

Dans ce exemple en vois clairement que tous Pointcol est avant tous un Point, et on dit que
La classe Pointcol une classe cliente de la classe Point

La mention ‘extends Point’ précise au compilateur que la classe Pointcol est une classe dérivée (ou sous-classe ou bien clientes) de Point.


  • SPECIALISATION-GÉNÉRALISATION


    1. Généralisation (de la class fille vers la class mère)
un Véhicule terrestre est un Véhicule mais un véhicule particulière la notion de Véhicule est une généralisation de la notion de Véhicule terrestre

    1. Spécialisation (de la class mère  vers la class fille)
Une classe fille offre de nouveaux services ou enrichit les services rendus par une classe  mère


Attention !!!!!:
Une classe ne peut avoir qu'une seule classe mère : il n'y a pas d'héritage multiple en java

  • RÉUTILISATION PAR L ’HÉRITAGE
La classe Object est la classe parente de toutes les classes en java ,toutes les variables et méthodes contenues dans Object sont accessibles à partir de n'importe quelle classe car par héritage successif toutes les classes héritent d' Object, de plus ,toutes les variables et méthodes contenues dans Object sont accessibles à partir de n'importe quelle classe car par héritage successif toutes les classes héritent d'Object

  • L ’HÉRITAGE PERMET LA SURCHARGE ET LA REDIFINITION

Grâce à l'héritage, les objets d'une classe ont accès aux données et aux méthodes de la classe parente et peuvent les étendre

 la surcharge : possibilité de définir des méthodes possédant le même nom mais dont les arguments (paramètres) sont différents

  Redéfinition (overriding) : lorsque la sous-classe définit une méthode dont le nom, les paramètres et le type de retour sont identiques

Une sous-classe peut ajouter des nouveaux attributs et/ou méthodes à ceux qu’elle hérite (surcharge en fait partie)

 Les sous classes peuvent redéfinir les variables et les méthodes héritées

Pour les variables, il suffit de les redéclarer sous le même nom avec un type différent
Les méthodes sont redéfinies (fournir des implémentations spécifiques pour celles-ci)

 avec le même nom, les mêmes types et le même nombre d'arguments, sinon il s'agit d'une surcharge

Exemple1 :
class Rectangle{
protected int lar ;
protected int lon;

public initialiser(int x,int y){
lar=x ; lon=y 
}

}
//héritage
public class RectangleColore extends Rectangle {

protected int coul;
...

// surcharge  de la méthode initialiser

public void initialiser(int x,int y, int c) {
lar=x ; lon=y ; coul=c ;
}

...
}

D’après cet exemple on vois que :
Un rectangle coloré est un rectangle avec une couleur ( évidant)
Un rectangle coloré répond aux mêmes messages que la rectangle
On peut afficher la couleur d’un rectangle coloré


Exemple 2 :
public class Rectangle {
protected int lon; 
protected int lar;
...
public void afficher() {
System.out.println(" larg= " + lar );
System.out.println(" long= " + lon );
….
}
}
public class RectangleColore  extends Rectangle {

protected int coul;
...
// redéfinition  de la méthode afficher

public void afficher() {
System.out.println(" larg= " + lar );
System.out.println(" long= " + lon );
System.out.println(" coul= " + coul ); }
...
}


  • Mot-clé super
La redéfinition d’une méthode cache le code de la méthode héritée réutiliser le code de la méthode hérité par le mot-clé super
 super permet ainsi la désignation explicite de l’instance d’une classe dont le type est celui de la classe mère
 Accès aux attributs et méthodes redéfinies par la classe courante mais que l’on désire utiliser                           
super.nomMethodeAppelee(...);


 Exemple: 
public class Rectangle {
private int lon; 
private int lar;
...
public void afficher() {
System.out.println(" larg= " + lar );
System.out.println(" long= " + lon );
}
}
public class RectangleColore  extends Rectangle {

private int coul;
...
public void afficher() {
// Appel de afficher() de la classe mère
super.afficher();
System.out.println(" coul= " + coul ); }
...
}

L’appel à la méthode afficher de RectangleColore fait appel à la méthode afficher de Rectangle(class mère)


  • Les Sous types
Si on par exemple :

Class B extends A{

/*…..*/}
B est un sous-type de A ,car  on peut ranger une expression de type B dans une variable de type A

 Les sous-classes d’une classe A sont des sous types de A

Si B extends A  le grand principe est que tout B est un A

 En effet, si B hérite de A, tout B est un A donc on peut  ranger un B dans une variable de type A

 Par exemple,    A a = new B(); est autorisé


Supposons que B hérite de A et que la méthode m() de A soit redéfinie dans B
Quelle méthode m() sera exécutée dans le code suivant, celle de A ou celle de B ?

A a = new B(5);
a.m();
// a est un objet de la classe B mais il est déclaré de la classe A

 La méthode appelée ne dépend que du type réel (B) de l’objet a et pas de type déclaré, ici A
C’est la méthode de la classe B qui sera exécutée

Maintenant, vous étés prêt pour commencer le cours du polymorphisme

Let's Go

Si vous avez des questions ou remarques , n'hésitez a me contacter

Advertiser