POO_S2_TDTP N5.pdf

Exercice 1

public class PointPlan {
    private float abscisse;
    private float ordonnee;

    public PointPlan() { }

    public PointPlan(float x, float y) {
        this.abscisse = x;
        this.ordonnee = y;
    }

    public PointPlan(PointPlan p) {
        this(p.abscisse, p.ordonnee);
    }

    public float getAbscisse() {
        return this.abscisse;
    }

    public float getOrdonnee() {
        return this.ordonnee;
    }

    public String toString() {
        return ("\\n abscisse = " + this.abscisse + " ordonnee = " + this.ordonnee);
    }

    public void init() {
        // lecture des valeurs de : abscisse et ordonnee
    }
}

public class Point3D extends PointPlan {
    private float azimut;

    public Point3D() {
        super();
    }

    public Point3D(float x, float y, float z) {
        super(x, y);
        this.azimut = z;
    }

    public Point3D(Point3D p) {
        super(p);
        this.azimut = p.azimut;
    }

    public float getAzimut() {
        return this.azimut;
    }
}

Énumérer toutes les anomalies de conception de la classe Point3D ainsi que les instructions rejetées par le compilateur. Justifier chaque réponse.

Anomalies de conception :

Héritage inapproprié : La méthode init() de PointPlan n'est pas implémentée dans Point3D.

Redondance de méthodes : Les méthodes getAbscisse() et getOrdonnee() sont redondantes dans la classe Point3D car elles sont déjà définies dans la classe parent PointPlan.

Instructions rejetées par le compilateur :

Appel de méthode non définie : L'appel à la méthode super() dans le constructeur de la classe Point3D est incorrect car il n'y a pas de constructeur par défaut défini dans la classe parent PointPlan. Cela entraînera une erreur de compilation.

Utilisation d'attributs non accessibles : Les attributs abscisse et ordonnee sont déclarés comme private dans la classe parent PointPlan, ils ne sont pas directement accessibles dans la classe Point3D. Par conséquent, les tentatives d'accès à ces attributs dans la classe Point3D seront rejetées par le compilateur.

public void init(){	
	System.out.println("Veuillez saisir la valeur de l'abscisse : ");
	this.abscisse = input.nextInt();
	
	System.out.println("Veuillez saisir la valeur de l'ordonnée : ");
	this.ordonnee = input.nextInt();
}

Exercice 2 : Communications téléphoniques

Soit la classe suivante gérant une communication téléphonique locale :

public class Communication {
    private float duree; // durée de la communication
    private String numero; // numéro appelé
    public static final float PRIX_SECONDE = 0.01; // prix de la seconde

    public Communication() {
        // constructeur vide
    }

    // initialise une nouvelle communication de durée d et de numéro num
    public Communication(float d, String num) {
        this.duree = d;
        this.numero = num;
    }

    // constructeur par copie
    public Communication(Communication c) {
        this(c.duree, c.numero);
    }

    // retourne la durée de la communication
    public float getDuree() {
        return this.duree;
    }

    // retourne le numéro appelé
    public String getNumero() {
        return this.numero;
    }

    // retourne la chaîne représentant la communication courante
    public String toString() {
        return ("\\n duree = " + this.duree + " numero appele = " + this.numero);
    }

    // initialise interactivement la communication courante
    public void init() {
        // lecture des valeurs de duree et numero
    }

    // retourne le prix de la communication courante
    public float prixCommunication() {
        return this.duree * Communication.PRIX_SECONDE;
    }
}

On souhaite étendre cette classe de façon à gérer une communication internationale qui possède 2 données supplémentaires : le pays appelé (représenté par une chaîne de caractères) et le prix de la seconde de communication pour ce pays. Écrire la classe CommunicationInter(et une classe TestCommunicationInter) en respectant les étapes suivantes :

  1. Écrire les variables d’instances.
  2. Écrire 3 constructeurs (un constructeur vide, un constructeur donnant tous les arguments nécessaires pour initialiser une communication internationale et un constructeur par copie).
  3. Écrire les méthodes d’accès.
  4. Si nécessaire compléter la classe de façon à pouvoir afficher, initialiser interactivement et calculer le prix d’une communication internationale.