Programmation par les Objets en Java
Najib Tounsi
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.