Aller au contenu

TP ChienChien & POO

Énoncé

En vous aidant des classes déjà existantes : Étendre la Classe Chien :

Dans la classe Main, créez un 3ème chien (monChien3) avec un poids de 25.5 kg, puis appelez la méthode courir().

modèle Générique de base

public class Chien {
    // Attributs privés (encapsulation)
    private String nom;
    private String race;
    private int age;

    // Constructeur par défaut
    public Chien() {}

    // Constructeur paramétré
    public Chien(String nom, String race, int age) {
        this.nom = nom;
        this.race = race;
        this.age = age;
    }

    // Méthodes (comportements)
    public void aboyer() {
        System.out.println(nom + " dit: Woof! Woof!");
    }

    public void manger() {
        System.out.println(nom + " mange des croquettes.");
    }

    // Getters et Setters (encapsulation)
    public String getNom() {
        return nom;
    }

    public void setNom(String nom) {
        this.nom = nom;
    }

    public String getRace() {
        return race;
    }

    public void setRace(String race) {
        this.race = race;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

Objets Chien (Instances Concrètes)

public class Main {
    public static void main(String[] args) {
        // instances de la classe Chien
        Chien monChien1 = new Chien("Rex", "Labrador", 3);
        Chien monChien2 = new Chien("Bella", "Berger Australien", 5);

        // Utilisation des méthodes
        monChien1.aboyer();  // Rex dit : Woof! Woof!
        monChien2.manger();  // Bella mange des croquettes.

        // attributs via les getters
        System.out.println(monChien1.getNom() + " est un " + monChien1.getRace());
        // Rex est un Labrador
    }
}

Rappels et explications

Concept Explication Exemple dans le Code
Classe Modèle définissant les attributs (données) et méthodes (comportements) d’un ensemble d’objets. class Chien { private String nom; public void aboyer() { ... } }
Objet Instance concrète d’une classe. Possède un état (valeurs des attributs) et un comportement. Chien monChien1 = new Chien("Rex", "Labrador", 3);
Encapsulation Protection des attributs via des modificateurs d’accès (private) et des getters/setters. private String nom; public String getNom() { return nom; }
Constructeur Méthode spéciale pour initialiser un objet lors de sa création. public Chien(String nom, String race, int age) { this.nom = nom; ... }
Méthodes Comportements (actions) associés à un objet. aboyer(), manger()
Concept Définition Exemple
Classe Modèle (ou “plan”) qui définit les attributs (données) et les méthodes (comportements) communs à un ensemble d’objets. Une classe est un concept logique, pas physique. public class Voiture { private String marque; public void demarrer() { ... } }
Objet Instance concrète d’une classe. Un objet possède un état (valeurs des attributs) et un comportement (méthodes). Voiture maVoiture = new Voiture(); (ici, maVoiture est un objet de la classe Voiture).
Héritage Mécanisme permettant à une classe (classe enfant) d’hériter des attributs et méthodes d’une autre classe (classe parent). Cela crée une relation “est un” (ex. : une VoitureElectrique est une Voiture). public class VoitureElectrique extends Voiture { ... }
Polymorphisme Capacité d’une méthode ou d’un objet à prendre plusieurs formes. Deux types :
1. Surcharge (overloading) : Plusieurs méthodes avec le même nom mais des paramètres différents.
2. Redéfinition (overriding) : Une sous-classe redéfinit une méthode de sa super-classe.
Surcharge : demarrer() et demarrer(boolean modeSilencieux).
Redéfinition : @Override public void demarrer() { ... }
Abstraction Technique consistant à masquer les détails complexes et à ne montrer que les fonctionnalités essentielles à l’utilisateur. Permet de créer des modèles simplifiés et adaptés à un contexte spécifique. public abstract class Vehicule { public abstract void demarrer(); } (la méthode demarrer() n’a pas d’implémentation, elle doit être redéfinie par les sous-classes).
Encapsulation Principe consistant à cacher les données (attributs) d’une classe et à n’autoriser l’accès qu’à travers des méthodes publiques (getters/setters). Protège l’intégrité des données et permet de contrôler les modifications. private double solde; public double getSolde() { return solde; } public void setSolde(double solde) { if (solde >= 0) this.solde = solde; }
Association Relation bidirectionnelle ou unidirectionnelle entre deux objets, où chaque objet a son propre cycle de vie. Aucun objet ne “possède” l’autre. public class Enseignant { private List<Etudiant> etudiants; } et public class Etudiant { private List<Enseignant> enseignants; } (un enseignant peut avoir plusieurs étudiants, et vice versa).
Agrégation Forme d’association où un objet (le “tout”) contient d’autres objets (les “parties”), mais les parties peuvent exister indépendamment du tout. Relation “a un” (ex. : un département a des enseignants). public class Departement { private List<Enseignant> enseignants; } (un enseignant peut exister même si le département est supprimé).
Composition Forme forte d’aggrégation où les objets enfants n’existent pas sans le tout. Si le tout est détruit, les enfants le sont aussi. Relation “est composé de” (ex. : une maison est composée de pièces). public class Maison { private List<Piece> pieces; } (une pièce n’a pas de sens sans la maison ; si la maison est détruite, les pièces le sont aussi).

Correction

// Classe Chien mise à jour
public class Chien {
    private String nom;
    private String race;
    private int age;
    private double poids;  // Nouvel attribut

    public Chien(String nom, String race, int age, double poids) {
        this.nom = nom;
        this.race = race;
        this.age = age;
        this.poids = poids;
    }

    // Getter et Setter pour poids
    public double getPoids() {
        return poids;
    }

    public void setPoids(double poids) {
        this.poids = poids;
    }

    // Nouvelle méthode
    public void courir() {
        System.out.println(nom + " court à toute vitesse !");
    }

    // ... (autres méthodes existantes)
}

// Classe Main mise à jour
public class Main {
    public static void main(String[] args) {
        Chien monChien1 = new Chien("Rex", "Labrador", 3, 30.0);
        Chien monChien2 = new Chien("Bella", "Berger Australien", 5, 20.0);
        Chien monChien3 = new Chien("Max", "Golden Retriever", 2, 25.5);

        monChien1.aboyer();
        monChien2.manger();
        monChien3.courir();  // Max court à toute vitesse !
    }
}

Questions de Réflexion

Réponse : Pour protéger les données et contrôler leur accès via des getters/setters (encapsulation).

Réponse : Une classe est un modèle (ex. : plan d’une voiture), un objet est une instance concrète (ex. : une voiture spécifique).

Réponse : L’attribut prendra une valeur par défaut (ex. : 0 pour int, null pour String).

Réponse : Pour valider les données (ex. : vérifier qu’un âge est positif) et maintenir l’encapsulation.

Extensions Possibles

Héritage : Créer une Sous-Classe ChienDeGarde

public class ChienDeGarde extends Chien {
    private boolean estDresse;

    public ChienDeGarde(String nom, String race, int age, double poids, boolean estDresse) {
        super(nom, race, age, poids);
        this.estDresse = estDresse;
    }

    public void surveiller() {
        System.out.println(getNom() + " surveille la propriété !");
    }
}

Polymorphisme : Redéfinir la Méthode aboyer()

@Override
public void aboyer() {
    System.out.println(getNom() + " dit: GRRR! Woof! (mode garde)");
}

Utilisation dans Main

ChienDeGarde monChienDeGarde = new ChienDeGarde("Rex", "Berger Allemand", 4, 35.0, true);
monChienDeGarde.surveiller();  // Affiche: Rex surveille la propriété !
monChienDeGarde.aboyer();      // Affiche: Rex dit: GRRR! Woof! (mode garde)

Résumé Visuel

Concept Définition Exemple dans le Code
Classe Modèle définissant les attributs et méthodes d’un ensemble d’objets. class Chien { private String nom; public void aboyer() { ... } }
Objet Instance concrète d’une classe. Chien monChien1 = new Chien("Rex", "Labrador", 3, 30.0);
Encapsulation Protection des attributs via des modificateurs private et des getters/setters. private double poids; public double getPoids() { return poids; }
Constructeur Méthode pour initialiser un objet. public Chien(String nom, String race, int age, double poids) { ... }
Méthode Comportement associé à un objet. courir(), aboyer().
Héritage Une classe enfant hérite des attributs/méthodes d’une classe parent. class ChienDeGarde extends Chien { ... }
Polymorphisme Une méthode peut être redéfinie dans une sous-classe. @Override public void aboyer() { ... }

Pour Aller Plus Loin

Votre association décide de gèrer plusieurs catégories d’Animaux et vous demande de mettre en place la possibilité d’afficher depuis une Collection les caractéristiques de chaque Animal: Utiliser une **List** pour gérer plusieurs *chiens*, *oiseaux*, *chevaux* et *tortues* avec leurs propres spécificités, sachant qu'un cheval peut aussi bénficier de l'interface **Dressable** qui oblige l'utilisation de la méthode **executerOrdre()**.

Vous êtes de mettre ce que vous voulez dans les différentes méthodes.