/** Tester le polymorphisme(principe de substitution) et la liaison * dynamique. * @author Xavier Crégut * @version 1.5 */ public class TestPolymorphisme { /** Méthode principale */ public static void main(String[] args) { // Créer et afficher un point p1 Point p1 = new Point(3, 4); // Est-ce autorisé ? Pourquoi ? // oui, on utilise le constructeur de la classe p1.translater(10,10); // Quel est le translater exécuté ? // celui de Point System.out.print("p1 = "); p1.afficher(); System.out.println(); // Qu'est ce qui est affiché ? // p1 = (13.0, 14.0) // Créer et afficher un point nommé pn1 PointNomme pn1 = new PointNomme(30, 40, "PN1"); // Est-ce autorisé ? Pourquoi ? // oui, on utilise le constructeur de la classe pn1.translater(10,10); // Quel est le translater exécuté ? // celui de PointNomme, donc celui de Point par héritage System.out.print("pn1 = "); pn1.afficher(); System.out.println(); // Qu'est ce qui est affiché ? // pn1 = PN1:(40.0, 50.0) // Définir une poignée sur un point Point q; // Attacher un point à q et l'afficher q = p1; // Est-ce autorisé ? Pourquoi ? // oui, les types des deux objets sont les mêmes System.out.println("> q = p1;"); System.out.print("q = "); q.afficher(); System.out.println(); // Qu'est ce qui est affiché ? // q = (13.0, 14.0) // Attacher un point nommé à q et l'afficher q = pn1; // Est-ce autorisé ? Pourquoi ? // oui, PointNommé est pas un sous-type de Point System.out.println("> q = pn1;"); System.out.print("q = "); q.afficher(); System.out.println(); // Qu'est ce qui est affiché ? // q = PN1:(40.0, 50.0) // Définir une poignée sur un point nommé PointNomme qn; // Attacher un point à q et l'afficher // qn = p1; // Est-ce autorisé ? Pourquoi ? // Non, Point n’est pas un sous-type de PointNommé // System.out.println("> qn = p1;"); // System.out.print("qn = "); qn.afficher(); System.out.println(); // Qu'est ce qui est affiché ? // rien, ça compile pas // Attacher un point nommé à qn et l'afficher qn = pn1; // Est-ce autorisé ? Pourquoi ? // oui, les types des deux objets sont les mêmes System.out.println("> qn = pn1;"); System.out.print("qn = "); qn.afficher(); System.out.println(); // Qu'est ce qui est affiché ? // qn = PN1:(40.0, 50.0) double d1 = p1.distance(pn1); // Est-ce autorisé ? Pourquoi ? // oui, par Liaison dynamique System.out.println("distance = " + d1); double d2 = pn1.distance(p1); // Est-ce autorisé ? Pourquoi ? // oui, par héritage System.out.println("distance = " + d2); double d3 = pn1.distance(pn1); // Est-ce autorisé ? Pourquoi ? // oui, par héritage System.out.println("distance = " + d3); System.out.println("> qn = q;"); // qn = q; // Est-ce autorisé ? Pourquoi ? // Non, Point n’est pas un sous-type de PointNommé // System.out.print("qn = "); qn.afficher(); System.out.println(); // Qu'est ce qui est affiché ? // rien, erreur de compilation System.out.println("> qn = (PointNomme) q;"); qn = (PointNomme) q; // Est-ce autorisé ? Pourquoi ? // oui, car q = pn1, transtypage System.out.print("qn = "); qn.afficher(); System.out.println(); // System.out.println("> qn = (PointNomme) p1;"); // qn = (PointNomme) p1; // Est-ce autorisé ? Pourquoi ? // non, p1 ne comporte pas de nom, conversion impossible // System.out.print("qn = "); qn.afficher(); System.out.println(); } }