ESISAR : 3ème Année CS-310 : Programmation Orientée Objets TP3 : Polymorphisme et Classes Abstraites 16 mars 2004 Remarques préliminaires But : Dans cette troisième séance de TP, vous continuerez d’aborder l’héritage de classe mais par l’intermédiaire d’une classe abstraite. Classe abstraite : Une classe abstraite est une classe de base qui permet de définir une interface commune pour toutes ses classes dérivées. abstract class OurShape { /* ... */} class OurParallelogram extends OurShape { /* ... */} En règle générale, les objets d’une classe abstraite n’ont aucun sens. Une telle classe est définie pour exprimer seulement une interface. Certaines méthodes de cette classe sont abstraites : public abstract double perimeter(); Elles doivent donc être redéfinies par les classes dérivées. Conception d’un programme : Avant de vous lancer dans l’implémentation de ce TP, vous devez impérativement passer du temps sur la conception. Quelles sont les classes manipulées ? Qui hérite de qui ? Etc. Ne vous laissez pas influencer par l’affichage graphique des objets qui seront créés dans la classe ShapeTester. Cela n’interviendra qu’à la fin de l’exercice 2. Vous devez concevoir les classes dérivées de OurShape comme des classes manipulant des objets mathématiques sans considération de leur affichage effectif dans une fenêtre (à l’exception de la méthode draw). C’est d’ailleurs la démarche que nous avions adoptée dans le TP1 où nous avons manipulé des objets mathématiques Complex. Nous avions défini leurs charactéristiques et de leurs comportements sans nous occuper de leur éventuel affichage à l’écran. Classe Graphics : Cette classe est définie dans le package java.awt. Elle fournit entre autres, des méthodes permettant de dessiner des figures géométriques à l’écran. Méthode paint() : Cette méthode doit obligatoirement être définie avant la fonction main(). Elle est appelée implicitement par le système d’exploitation pour dessiner ou redessiner les composants présents dans la fenêtre à chaque fois que celle-ci est touchée. public void paint(Graphics screen) { // instructions d’affichage des composants de la fenêtre } 1 On ne peut pas l’appeler directement mais, si besoin est, on peut invoquer la méthode repaint() ce qui force le système à exécuter la méthode paint() et donc à redessiner les composants. Méthode setVisible(true) : Cette méthode permet d’afficher ou de rendre visible la fenêtre (objet Frame dérivée de Window) courante (qui contient les composants) en la plaçant au dessus des autres. Elle signifie que le système d’exploitation peut exécuter la fonction paint(). Exercice 1 Développez la classe abstraite OurShape qui supporte les méthodes (abstraites) suivantes : public public public public public public public public public double perimeter() double area() void translate(int deltaX, int deltaY) void scale(double factor) // Homothétie void setColor(Color c) Color color() void setFilled() boolean filled() void draw(Graphics g) // Dessine la forme concernée Nous définissons l’origine d’une forme comme l’origine de la "bounding box" de la forme (rectangle virtuel circonscrit à la forme). Exercice 2 Développez les sous-classes suivantes (non-abstraites !) de OurShape : OurRectangle, OurSquare, OurParallelogram, OurEllipse et OurCircle. Implémentez les constructeurs suivants : public public public angle) public public OurRectangle(int x, int y, int width, int height) OurSquare(int x, int y, int width) OurParallelogram(int x, int y, int width, int height, double OurEllipse(int x, int y, int width, int height) OurCircle(int x, int y, int width) Utilisez l’héritage pour organiser les classes d’une manière logique ! Testez les classes en construisant une classe ShapeTester qui est une sous-classe de Frame. Exercice 3 Utilisez les classes d’exercice 2 pour développer une classe Car. La classe doit supporter les méthodes suivantes : public Car(int x, int y, int size) public void draw(Graphics g) Exercice 4 (optionnel) Construisez une classe Ngon qui est une sous-classe non abstraite de OurShape. Implémentez le constructeur suivant : public void Ngon(int x, int y, int nSides int widthSide) Cette classe représente des formes comme des pentagones, hexagones, etc. 2