Programmation par les Objets en Java

Najib Tounsi

Interfaces encore.

Soit l'interface:

interface Printer {
// Interface pour imprimer un objet
public void print();
}

1) Réaliser cet interface avec la classe Article (cf Cours). Rajouter à Article la méthode :

public void print(){
System.out.printf("(%d, %s, %f, %d)\n",numero, designation, prixHT, qte);
}

Faire de même dans la classe Point, lui rajouter :

public void print(){
System.out.printf("(%d, %d)\n",x,y);
}

2) Tester avec  la séquence d'instructions :

Point point = new Point(1,2);
Article article = new Article (2,"chemise",15.5, 45);
point.print();
article.print();

Rien de spécial à noter ici, imprime le point et l'article.

Tester ensuite comme suit (noter les déclarations changées):

Printer point = new Point(1,2);
Printer article = new Article (2,"chemise",15.5, 45);
point.print();
article.print();

Commenter.

(Résultat comme précédemment) :

 (1, 2)
 (2, chemise, 15.500000, 45)

Autre aspect du polymorphisme, non lié à l'héritage: deux objets indépendants (point et article) déclarés néanmoins de même type (interface Printer ici) et qui exécutent l'opération print() de cette interface, mais chacun à sa façon.)

3) Tester aussi avec la séquence suivante :

Point point = new Point(1,2);
Article article = new Article (2,"chemise",15.5, 45);

Printer [] p
= {point, article};

for (int i=0; i<2; i++)
p[i].print();

Même résultat. C'est aussi un intérêt du polymorphisme. Notation unique p[i].print(); .

4) Tester ensuite  la séquence d'instructions (ne pas imiter!):

 Printer point = new Point(1,2);
Printer article = new Article (2,"chemise",15.5, 45);
point = article; // Hummmm ...
point.print(); // print de Article bien sûr!

Constater la différence entre point.print() de 2) qui imprime un point.

La chose à noter ici, c'est qu'on a deux objets (point et article) sans aucun lien conceptuel qui sont "interchangeables". (Ne pas imiter...)

5) Exercice :  Dans le même esprit, rajouter  à l'interface Printer une méthode versChaine() qui est censée convertir un objet quelconque vers une chaîne de caractères lisible (on dit sérialiser l'objet). Chaîne à utiliser par l'objet correspondant lui même pour l'échanger, le stocker,  l'imprimer etc...

Indication : pour un point de coordonnées (1, 2), cela pourrait être la chaîne "{x:1, y:2}"

Réaliser cette interface avec des classes à vous. Tester.