IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Constructeur classe abstraite héritage


Sujet :

avec Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 63
    Par défaut Constructeur classe abstraite héritage
    Bonjour je veux construire la classe abstraite Animal avec les propriétés (tailles, poids) en classe abstraite.
    Je veux ensuite créer des sous classes du type poissons, insectes, chacun ayant des propriétés supplémentaires différentes.

    Dois je déclarer un constructeur Animal dans la classe abstraite?
    Dois je déclarer uniquement les constructeurs Poissons Insectes dans les sous classes ou dois-je déclarer des constructeurs dans toutes ces classes ?

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Ça dépend de ce que tu veux faire. Un constructeur sert à initialiser une classe : si tu as quelque chose à initialiser dans ta classe abstraite, à fortiori avec des paramètres, il faudra y mettre un constructeur (ou plusieurs selon), et donc forcément mettre des constructeurs dans les classe filles, qui au moins appellent ce constructeur.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public abstract class Animal {
     
       private final int poids;
     
       public Animal(int poids) {
          this.poids=poids;
       }
     
       public final int getPoids() {
          return poids;
       }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public class Suricate {
     
       public Suricate(int poids) {
          super(poids);
       }
     
       /**
         * Crée un suricate de poids minimum (400 grammes)
         */
       public Suricate() {
          this(400);
       }
     
     
    }
    L'alternative sans constructeur serait d'avoir une méthode setPoids(), mais dans ce cas, déjà, le poids ne pourrait être final, mais surtout on pourrait modifier le poids à tout moment en mettant n'importe qu'elle valeur, ce qu'on peut vouloir éviter (et préférez gérer l'augmentation ou la baisse de poids avec un traitement qui dépend de pleins de paramètres : temps, nourriture ingéré, énergie dépensée, etc...). Mais on peut aussi utiliser un setter protected :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public abstract class Animal {
     
       private int poids;
     
       public final int getPoids() {
          return poids;
       }
     
       protected final void setPoids(int poids) {
          this.poids=poids;
       }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public class Suricate {
     
       public Suricate(int poids) {
          setPoids(poids);
       }
     
       /**
         * Crée un suricate de poids minimum (400 grammes)
         */
       public Suricate() {
          this(400);
       }
     
       public void nourrir(int poids) {
           setPoids( getPoids() + (int)(poids*.6d)); // 0.6 coefficient d'absorption
       }
     
    }
    Bien sûr, on peut avoir une classe abstraite sans constructeur (ou plutôt exactement avec le constructeur par défaut implicite), et avoir des constructeurs explicités avec paramètres dans les classes filles avec des paramètres pour initialiser des variables propres à chaque classe filles. Ou encore avoir des paramètres supplémentaires :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public abstract class Mammifere extends Animal {
     
        private final int nombreMamelles;
     
        public Mammifere(int poids, int nombreMamelles) {
             setPoids(poids);
             this.nombreMamelles=nombreMamelles;
        }       
     
        public final int getNombreMamelles() {
            return nombreMamelles;
        }
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 63
    Par défaut
    Bonsoir,

    merci pour cette réponse claire et détaillée.

    Je vais la mettre en application avec mon problème.

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 63
    Par défaut
    Bonjour, je rencontre quelques problèmes sur ce constructeur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Araignee extends Animals {
    	private int NbPattes;
    	public Araignee(String Nom, int NbPattes){
    		super(Taille);
    		this.NbPattes = NbPattes;
    	}
     
    }
    lorsque je test avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public void main(String args[]){
    	Araignee Spider = new Araignee("mygale",8);}
    La réponse que j'ai est :
    Constructor in class cannot be applied to given types
    required: no arguments
    found; string

    Pourquoi est ce que ça me dit que que le required n'a pas besoin d'arguments ? Je suppose qu'il y a un probleme dans mon constructeur.

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Et c'est quoi le code de Animals ? C'est quoi Taille ? Une final static de type String probablement ? Si tu veux qu'on puisse dire ce qui ne va pas dans le code, il faut nous mettre un minimum d'information pour qu'on ait pas à faire de la déduction, ou de la divination.
    Là, ce que je déduis c'est que le contructeur de Animals n'a pas d'argument, donc l'argument que tu passes dans l'appel de super() est refusé.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 63
    Par défaut
    voici le code Animals:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public abstract class Animals {
    	private final String Nom;
     
    	}

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 63
    Par défaut
    ok je crois que j'ai compris j'ai rajouté ces lignes et ça marche grace à ta remarque
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public Animal (String Nom){
    		this.Nom = Nom;
     
    	}
    }

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Bah oui, voilà, il n'y a pas de constructeur explicite dans Animals, donc il n'y a que le constructeur par défaut, implicite, sans argument. Donc tu ne peux pas passer d'arguments à son constructeur dans l'extension de cette classe.

    En plus, il y a une variable final dans cette classe : on ne peut changer la valeur de cette variable. Mais comme il faut bien pouvoir lui en donner une, on peut le faire, soit en direct lors de la déclaration, soit une seule fois dans un constructeur. Mais il faut absolument lui donner une taille : la classe Animals ne peut pas être compilée en l'état, car nom n'a pas de valeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public abstract class Animals {
     
       private final String nom;
     
       public Animals(String nom) { // là on a un moyen de passer un paramètre lors de l'instanciation
           this.nom = nom; // et ce paramètre permet de donner une valeur à nom
       }
     
    }
    Ce qui te permettra de créer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Araignee extends Animals {
    	private int nbPattes;
    	public Araignee(String nom, int nbPattes){
    		super(nom); // la classe Animals a un constructeur avec un paramètre, qu'on peut donc appeler
    		this.nbPattes = nbPattes;
    	}
     
    }
    PS ça n'a rien à voir avec Java, mais une araignée a forcément 8 pattes (à moins d'être estropiée bien sûr, ou mutante peut-être), donc inutile d'avoir un paramètre pour le préciser
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  9. #9
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 63
    Par défaut
    Merci pour ces réponses.

    Mon programme avance doucement mais surement.

    Effectivement, pour les pattes des araignées En fait, cette histoire d'animaux, je l'ai un peu inventé pour poser mes questions, mon programme est tout autre mais utilise de la même manière les constructeurs et les héritages.

Discussions similaires

  1. héritage et classes abstraites
    Par reloadead dans le forum Langage
    Réponses: 5
    Dernier message: 31/01/2007, 10h08
  2. Réponses: 14
    Dernier message: 17/11/2006, 19h17
  3. Conception: héritage d'une classe abstraite
    Par Kikito dans le forum Langage
    Réponses: 19
    Dernier message: 05/10/2006, 17h36
  4. Classe abstraite et constructeurs
    Par koala01 dans le forum C++
    Réponses: 6
    Dernier message: 21/08/2006, 01h00
  5. pb constructeurs classes dérivant classe abstraite
    Par Cornell dans le forum Langage
    Réponses: 2
    Dernier message: 10/02/2003, 19h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo