La classe qui hérite d'une classe abstract, doit être abstract ?

Résolu/Fermé
estrellas6 Messages postés 36 Date d'inscription vendredi 26 juillet 2013 Statut Membre Dernière intervention 7 mars 2014 - 30 juil. 2013 à 11:49
estrellas6 Messages postés 36 Date d'inscription vendredi 26 juillet 2013 Statut Membre Dernière intervention 7 mars 2014 - 2 août 2013 à 12:43
Bonjour,

je suis en train de suivre le tutoriel de site du zéro "Apprenez à programmer en Java".
Dans la partie "classe abstraite et interface" plus précisément "étoffons notre classe", j'ai recopié le code proposé par le site où il déclare les classes (chat, chien, loup, tigre et lion) qui héritent d'une classe abstract (canin et félin) comme des classes public.
Le problème c'est que éclipse me demande de les convertir en "abstract" et à cause de ça j'ai un problème de compilation.
Alors c quoi la solution ?

et merci :)

6 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
30 juil. 2013 à 18:27
À quel moment as tu un problème avec Eclipse ?

Au final le code source que tu dois avoir est :

public abstract class Animal {

    protected String couleur;
    protected int poids;

    protected void manger() {
        System.out.println("Je mange de la viande.");
    }

    protected void boire() {
        System.out.println("Je bois de l'eau !");
    }

    abstract void deplacement();

    abstract void crier();

    public String toString() {
        String str = "Je suis un objet de la " + this.getClass() + ", je suis "
                + this.couleur + ", je pèse " + this.poids;
        return str;
    }
}

public abstract class Felin extends Animal {
    void deplacement() {
        System.out.println("Je me déplace seul !");
    }
}

public abstract class Canin extends Animal {
    void deplacement() {
        System.out.println("Je me déplace en meute !");
    }
}

public class Chien extends Canin {

    public Chien() {

    }

    public Chien(String couleur, int poids) {
        this.couleur = couleur;
        this.poids = poids;
    }

    void crier() {
        System.out.println("J'aboie sans raison !");
    }
}

public class Loup extends Canin {

    public Loup() {

    }

    public Loup(String couleur, int poids) {
        this.couleur = couleur;
        this.poids = poids;
    }

    void crier() {
        System.out.println("Je hurle à la Lune en faisant ouhouh !");
    }
}

public class Tigre extends Felin {

    public Tigre() {

    }

    public Tigre(String couleur, int poids) {
        this.couleur = couleur;
        this.poids = poids;
    }

    void crier() {
        System.out.println("Je grogne très fort !");
    }
}

public class Chat extends Felin {

    public Chat() {

    }

    public Chat(String couleur, int poids) {
        this.couleur = couleur;
        this.poids = poids;
    }

    void crier() {
        System.out.println("Je miaule sur les toits !");
    }
}

public class Test {
    public static void main(String[] args) {
        Loup l = new Loup("Gris bleuté", 20);
        l.boire();
        l.manger();
        l.deplacement();
        l.crier();
        System.out.println(l.toString());
    }
}

Et l'exécution de la classe Test donne ce résultat :

Je bois de l'eau !
Je mange de la viande.
Je me déplace en meute !
Je hurle à la Lune en faisant ouhouh !
Je suis un objet de la class Loup, je suis Gris bleuté, je pèse 20
0
estrellas6 Messages postés 36 Date d'inscription vendredi 26 juillet 2013 Statut Membre Dernière intervention 7 mars 2014
31 juil. 2013 à 13:41
après le test il compile mais il m'affiche un croix rouge au niveau de nom de chaque classe (chien chat loup tigre lion) il me demande soit de les déclarer comme abstract soit d'ajouter la méthode "deplacement" à ces dernières

merci
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
31 juil. 2013 à 21:09
La méthode "déplacement" est déclarée dans les classes Felin et Canin, il n'est donc pas nécessaire de la redéfinir pour Chien, Loup (qui héritent de Canin) ni Chat, Tigre, Lion (qui héritent de Felin).

Vérifie que tu as bien hérité ce qu'il fallait, mais le code du tuto est correct, et si tu fais des copier-coller ça fonctionnera.

          Object
            |
          Animal
         /      \
        /        \
    Canin        Felin
    /   \       /  |  \
Chien  Loup    /   |   \
            Chat Tigre Lion
0
estrellas6 Messages postés 36 Date d'inscription vendredi 26 juillet 2013 Statut Membre Dernière intervention 7 mars 2014
31 juil. 2013 à 22:20
ok voici le code je vais faire juste copier coller

Pour "Animal"

public abstract class Animal {



protected int poids;

protected String couleur;

protected void manger(){

System.out.println("je mange de la viande");

}



protected void boire (){

System.out.println("je bois de l'eau");

}



abstract void deplassement();

abstract void crier();



public String toString(){

String str="Je suis un objet de la "+this.getClass()+", je suis "+this.couleur+", je pèse "+this.poids;

return str;

}

public static void main(String[] args) {

// TODO Auto-generated method stub



}



}



"Felin"

public abstract class Felin extends Animal {



void deplacement(){

System.out.println("je me deplace seul");

}

public static void main(String[] args) {

// TODO Auto-generated method stub



}



}



pour "Canin"



public abstract class Canin extends Animal {



void deplacement(){

System.out.println("je me deplace en meute");

}

public static void main(String[] args) {

// TODO Auto-generated method stub



}



}



pour "Chat"



public class Chat extends Felin {



public Chat(){



}

public Chat (String couleur, int poids){

this.couleur=couleur;

this.poids=poids;

}

void crier(){

System.out.println("Je grogne ytrès fort");

}

public static void main(String[] args) {

// TODO Auto-generated method stub



}



}



pour "Chien"



public class Chien extends Canin {

public Chien (){



}

public Chien (String couleur, int poids){

this.couleur=couleur;

this.poids=poids;

}

void crier (){

System.out.println("j'aboie sans raison");

}





public static void main(String[] args) {

// TODO Auto-generated method stub



}



}



pour "Lion"



public class Lion extends Felin {



public Lion(){



}

public Lion(String couleur, int poids){

this.couleur=couleur;

this.poids=poids;

}

void crier(){

System.out.println("Je rugis dans la savane");

}

public static void main(String[] args) {

// TODO Auto-generated method stub



}



}



pour "Loup"



public class Loup extends Canin {



public Loup(){



}

public Loup(String couleur, int poids){

this.couleur=couleur;

this.poids=poids;

}

void crier(){

System.out.println("Je hurle à la lune en faisant houhou");

}

public static void main(String[] args) {

// TODO Auto-generated method stub



}



}



pour "Tigre"



public class Tigre extends Felin {



public Tigre(){



}

public Tigre(String couleur, int poids){

this.couleur=couleur;

this.poids=poids;

}

void crier(){

System.out.println("Je grogne ytrès fort");

}

public static void main(String[] args) {

// TODO Auto-generated method stub



}



}



Alors pour la compilation, le programme compile mais il m'affiche une petite croix rouge et il me demande soit d'ajouter la methode deplacement soit de les declarer comme abstract
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
31 juil. 2013 à 22:47
C'est parce que tu as défini dans la classe Animal une méthode deplassement (avec deux S) que tu ne redéfinis pas puisque les classes Felin et Canin ont une méthode deplacement (avec un C).
Java s'en moque des fautes d'orthographes, mais si les deux noms sont différents il pense que ce sont deux méthodes différentes donc celle qui devait être redéfinie ne l'est pas et ça ne lui plait pas.

PS. Dans ce cas le programme ne compile pas...
0
estrellas6 Messages postés 36 Date d'inscription vendredi 26 juillet 2013 Statut Membre Dernière intervention 7 mars 2014
1 août 2013 à 01:09
exactement mais dans mon cas il a compilé avec cette erreur il m'as juste indiqué l'erreur

merci beaucoup :)
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
1 août 2013 à 06:14
Il a pu compiler en partie seulement, car certaines classes étaient correctes et aussi en se servant des versions précédentes des classes (que tu avais déjà compilé avant de rajouter l'erreur)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
estrellas6 Messages postés 36 Date d'inscription vendredi 26 juillet 2013 Statut Membre Dernière intervention 7 mars 2014
1 août 2013 à 14:20
non il a compilé tout le programme en plus du ça j'avais pas autres méthodes "déplacement" c'été la seule ...
SVP j'ai une question: il y a la classe mère qui a ses propres méthodes, constructeurs etc . Et en même temps il y a la classe abstraite , quand est ce que on utilise une classe de base où on doit mettre le corps de toutes les méthodes ainsi que les constructeurs et quand on utilise la classe abstraite avec des méthodes abstraites.

merci
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
1 août 2013 à 20:41
Quand tu veux, suivant les besoins.

En plus :

1) Tu peux avoir une classe abstraite avec tout ou partie de méthodes concrètes (non abstraites), ça oblige à redéfinir une classe fille, mais avec la plupart des méthodes disponibles, ce qui donne généralement un comportement "par défaut" des méthodes.

2) Les constructeurs doivent forcément être redéfinie par les classes filles, que la classe mère soit abstraite ou concrète,

3) Tu verras certainement plus tard le fonctionnement des interfaces en Java qui sont encore une autre manière de déterminer les méthodes des classes.

Java (et les autres langages orienté objet) fournit donc plusieurs manières d'organiser les classes afin de regrouper tout ce qui peut l'être et permettre donc au développeur de ne gérer que le tronc commun de la classe mère et les particularités de chaque classe fille.
0
estrellas6 Messages postés 36 Date d'inscription vendredi 26 juillet 2013 Statut Membre Dernière intervention 7 mars 2014
2 août 2013 à 12:43
ok merci beaucoup j'espère que la partie "interface" est facile, merci :)
0