Mécanismes d'abstraction§

Méthode et classe abstraite§

Mot-clé abstract§

abstract void methodeAbstraite();
abstract class ClasseAbstraite { ... }
ClasseAbstraite unObjet; //compile
unObjet = new ClasseAbstraite(); //ne compile pas

A quoi ça sert ?§

L'abstraction sert à regrouper sous une même étiquette une catégorie d'objets, éventuellement de classes différentes, qui ont un point commun. Si seul ce point commun compte dans un programme, il est raisonnable que tous les objets de cette catégorie puissent être utilisés quelle que soit leur classe.

Par exemple, on peut raisonnablement dessiner une moto, une voiture, un train, un avion quand on nous le demande. En revanche, si on nous demande de dessiner un véhicule, qui est une catégorie plus abstraite, on voudra plus de précisions. Cependant, on sait que l'action de se déplacer est commune à tous les véhicules.

Ex.1. Integration/Point de variation (5 min)§

     System.out.println("sur ["+a+","+b+"] par pas de "+delta);
     double sum = 0;
     for (double x = a; x <= b; x += delta)
       sum += x*x * delta;
     return sum;
     sum += g.evaluer(x) * delta;

Ex.2. Integration/Parametre (10 min)§

Ex.3. Integration/Abstraction (15 min)§

Interfaces§

Interface§

Une interface est un ensemble de requêtes. Toutes les instances des classes implémentant une même interface répondent (à leur manière) à toutes ces requêtes et sont donc de ce point de vue interchangeables.

Il existe des appareils très différents fournissant un signal audio/vidéo (lecteur Blu-ray, ordinateur, console de jeu). Vous pouvez pourtant tous les relier à votre téléviseur par un connecteur approprié (HDMI) pourvu qu'ils respectent tous la même interface (norme et prise).

Syntaxe§

Une interface I liste toutes les requêtes qu'on peut adresser aux instances des classes l'implémentant:

interface I {
  void unePremiereRequete();
  ...
}

Une classe implémentant I est déclarée ainsi:

class A implements I { ... }

NB. Une classe peut dériver d'une autre et implémenter plusieurs interfaces:

class B extends A implements J, K { ... }

Polymorphisme§

Interfaces et classes (abstraites) partagent le mécanisme de polymorphisme; des objets de classes différentes sont interchangeables à partir du moment où leurs classes héritent d'une même classe parente ou implémentent la même interface.

abstract class A { ... }
class B extends A { ... }
interface I { ... }
class C implements I { ... }
A objetA = new B(); //transtypage ascendant implicite
I objetI = new C(); //idem

Classe abstraite vs interface§

Ex.4. Interface (10 min)§

Ex.5. Pile par tableau dynamique (15 min)§

Ce qu'il faut retenir§

Héritage de classe ?§

Finalement, pour savoir si l'héritage entre deux classes est approprié, l'important est de se demander si on veut exploiter

  1. la propriété d'extension de code.
  2. la propriété de polymorphisme,

Si on veut exploiter ces deux propriétés en même temps, l'héritage convient (mais c'est plutôt rare).

Dans le cas 1., une relation de composition pourrait être préférée.

Dans le cas 2., mieux vaut considérer l'utilisation d'une classe abstraite ou d'une interface.

Ce que vous devez savoir faire§