La surcharge de méthodes

Il s'agit d'un mécanisme fondamental consistant à donner une nouvelle définition pour une fonction avec un nouveau profil : cela signifie que une fonction de nom donné peut posséder plusieurs définitions une même classe, chacune de ces définitions se distinguant des autres au travers de la liste de ses paramètres (par contre le type du résultat n'intervient pas dans cette différenciation).

Conjuguée avec le mécanisme d'héritage, lié à la notion de sous-classes, la surcharge constitue l'un des mécanismes central de la programmation objet.

Il faut dès maintenant distinguer la surcharge de la redéfinition, dont nous parlons dans la section suivante qui, elle, consiste à donner dans une sous-class une nouvelle définition d'une fonction pour un profil pour lequel une définition existe dans une sur-classe (directe ou non).

Notons au passage que nous avons déjà utilisé la surcharge lors de la définition de constructeurs d'objets et avons vu à cette occasion que la sélection par le compilateur de la méthode à invoquer est réalisée sur la base de la liste et du type de ses différents paramètres.

Ce que nous avons fait pour les constructeurs peut l'être pour toute méthode d'une classe.


L'exemple suivant illustre les aspects suivants :

   --> cat Surcharge.java
   class A {
      int a, b;
      A(int a, int b){this.a = a; this.b = b; }
   }
   class B{
      private A couple;
      B(int a, int b){couple = new A(a,b); }
      B(A couple){this.couple = new A(couple.a, couple.b); }
      A getA( ){ return couple;}
      void ajouter(int inc){getA().a += inc; getA().b += inc; }
      void ajouter(B couple){
         this.getA().a += couple.getA().a;
         this.getA().b += couple.getA().b;
         }
      public String toString(){return "(" + getA().a +"," + getA().b + ")" ;}    
   }
   public class Surcharge {
      public static void main(String[] arg){
         B c1 = new B(3, 5);
         B c2;
         System.out.println("c1=" + c1);
         c1.ajouter(5);
         System.out.println("c1=" + c1);
         c2 = new B(c1.getA());
         c2.ajouter(c1);
         System.out.println("c1=" + c1);
         System.out.println("c2=" + c2);
      }
   }
   --> java Surcharge
   c1=(3,5)
   c1=(8,10)
   c1=(8,10)
   c2=(16,20)
   -->

Remarque : il n'est pas possible en Java de surcharger les opérateurs comme c'est le cas en C++ par exemple. Ainsi, il n'est pas possible par exemple de redéfinir l'opérateur + afin qu'il permette par exemple d'écrire une expression telle que M1 + M2 ayant comme valeur la somme des deux matrices. Notons cependant au passage que cet opérateur est d'une certaine manière surchargé puisque qu'il permet de réaliser la concaténation de chaînes de caractères.


Dernière mise à jour : 16 juin 2005

Valid XHTML 1.0! Valid CSS!