Programmation Orientée Objet

TP n° 5


Héritage/composition,

héritage : visibilité des attributs, affectation, liaison dynamique, super, redéfinition de méthode


Exercice 1. Comparaison composition versus héritage, attributs public/private/protected

On dispose de la classe suivante :

class Point {

    public double x, y;

    public Point(double x, double y) {

        this.x = x;

        this.y = y;

    }

    public void deplace(double dx, double dy) {

        x += dx;

        y += dy;

    }

    public String toString() {

        return "Point de coordonnees : " + x + ", " + y;

    }

}



On souhaite réaliser une classe Cercle disposant des méthodes suivantes :



Questions

A. Héritage et composition

  1. Définir la classe Cercle comme possédant un membre de type Point (composition).

  2. Définir la classe Cercle comme classe dérivée de Point (mot clé extends).

Dans les deux cas, on écrira un petit programme mettant en jeu les différents fonctionnalités de la classe Cercle comme par exemple :



public class TestCercle {

    public static void main(String[] args) {

        Cercle c = new Cercle(3, 8, 2.5);

        System.out.println(c);

        c.deplaceCentre(1, 0.5);

        c.changeRayon(5.25);

        System.out.println(c);

        Point pt = c.getCentre();

        System.out.println(pt);

    }

}



B. Visibilité des attributs

Dans la suite de l'exercice, la classe Cercle est dérivée de Point.

  1. Modifier les deux classes afin que les attributs deviennent privés. Ajouter des accesseurs à la classe Point : pubic double getX() et public double getY(). Modifier la classe Cercle en conséquence.

  2. Modifier la classe Point afin que ses attributs soient protected. Modifier la classe Cercle en conséquence. Tester l'accessibilité des attributs de Point dans le programme principal.


C. Affectation, liaison dynamique

La classe Cercle est dérivée de Point.

Parmi les instructions suivantes, dire quelles sont acceptées, refusées. Expliquer pourquoi.


public class TestCercle {

    public static void main(String[] args) {

        Point pt1, pt2;

        Cercle c1, c2;

        pt1 = new Point(4.2, 7.3);

        pt2 = new Cercle(14.7, 62, 5.2);

        c1 = new Cercle(3.56, 7.84, 2.25);

        c2 = new Point(56.1, 76.9);


        pt1.deplace(0.5, 0.5);

        pt2.deplace(0.3, 0.8);

        pt2.changerRayon(6.21);

        c1.deplace(0.4, 0.5);

        c1.changeRayon(2.52);

        c1.x = 4.78;

    }

}



Exercice 2. Super, redéfinition de méthode - Villes et Capitales

Soit le programme java qui utilise les classes Ville et Capitale


public class TestVille {

    public static void main(String args[]) {

    Ville v1,v2;

    v1= new Ville ("Toulouse");

    v2 = new Ville ("Strasbourg", 272975);

    System.out.println(v1);

    System.out.println(v2);

    System.out.println();

    Capitale c1, c2;

    c1 = new Capitale("Paris", "France");

    c2 = new Capitale("Rome", "Italie", 2700000);

    c1.setNbHabitants(2181371);

    System.out.println(c1);

    System.out.println(c2);

    System.out.println();

    System.out.println("catégorie de la ville de " +

        v1.getNom() + " : " + v1.categorie());

    System.out.println("catégorie de la ville de " +

        v2.getNom() + " : " + v2.categorie());

    System.out.println("catégorie de la ville de " +

        c1.getNom() + " : " + c1.categorie());

    System.out.println();

    }

}


qui lors de l'exécution affichera le résultat suivant :


Ville de TOULOUSE.

Ville de STRASBOURG ; 272975 habitants.


Ville de PARIS ; 2181371 habitants. Capitale de FRANCE.

Ville de ROME ; 2700000 habitants. Capitale de ITALIE.


catégorie de la ville de TOULOUSE : ?

catégorie de la ville de STRASBOURG : A

catégorie de la ville de PARIS : C


Questions

Donner les instructions Java pour définir les classes Ville et Capitale en respectant les spécifications suivantes :

  1. La classe Ville a les propriétés suivantes :

Rappel : dans la classe String, la méthode d'instance String toUpperCase() convertit tous les caractères de la chaîne en majuscule.

et les méthodes

On suppose que les données transmises en argument sont correctes. On ne demande pas de test et de gestion de situations d'erreur.

  1. Définir la classe Capitale. Une capitale est une ville particulière. Elle a pour attribut supplémentaire le nom du pays dont elle est la capitale. Le nom du pays est en majuscules.

Définir les constructeurs et redéfinir la méthode toString.

  1. On est amené à classer les villes en 4 catégories :

catégorie A : celles de moins de 500 000 habitants,

catégorie B : celles de 500 000 habitants et plus,

catégorie ? : celles dont le nombre d'habitants est inconnu,

catégorie C : celles qui sont capitales d'un pays, quel que soit le nombre d'habitants.

Dire comment et ou définir la méthode categorie qui renvoie l'un des 4 caractères '?', 'A', 'B' ou 'C'. Utiliser les liaisons dynamiques. Votre code ne doit pas comporter de test sur le type des variables.