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

Langage Java Discussion :

[Debutant] Probleme de (simple) heritage


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut [Debutant] Probleme de (simple) heritage
    Bonjour,
    Voici mon probleme (simplifie avec un exemple) :

    Message d'erreur a la compilation =
    Ovale.java:2: cannot resolve symbol
    symbol : constructor Cercle()
    location : classe Cercle
    public Ovale(Cercle c){

    et le code =
    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 Ovale extends Cercle {
      public Ovale (Cercle c){
        monCercle = c;
      }
     
      private Cercle monCercle;
    }
     
    public class Cercle {
      public Cercle (int x,int y){
        monAbscisse = x;
        monOrdonnee = y;
      }
     
      int monAbscisse;
      int monOrdonnee;
    }
    (j'utilise a la fois une extension et une aggregation dans le cadre du design pattern decorator)

    en revanche en changeant le code par ca =
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public class Ovale extends Cercle {
      public Ovale (Cercle c){
        monCercle = c;
      }
     
      private Cercle monCercle;
    }
     
    public class Cercle {
      public Cercle (){
      }
    }
    Il n'y a plus d'erreur a la compilation.
    En gros des que j'ai des arguments dans le constructeur de ma classe mere, cela ne compile plus.

    plz help me =)

    Punkachu

  2. #2
    Membre éprouvé Avatar de jerome.petit
    Inscrit en
    Novembre 2002
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 78
    Par défaut
    ça vient du fait que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public Ovale (Cercle c){ 
        monCercle = c; 
      }
    apelle implicitement le constructeur par défaut de la classe de base Cercle. Donc si tu n'as pas de constructeur par défaut (sans paramètres) dans Cercle ça ne compile pas.

    Deux solutions :
    - soit tu fais explicitement appel au constructeur Cercle (x, y) comme première instruction du constructeur de Ovale,
    - soit tu ajoutes un constructeur par défaut dans la classe Cercle : ce qui ne t'empêche pas de laisser aussi ton constructeur Cercle(x, y)

  3. #3
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Par défaut
    Pourquoi le constructeur Ovale(Cercle c) appelle le constructeur Cercle() ???


  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 65
    Par défaut
    Oui, ça vient du constructeur.
    Mais sinon, ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public class Ovale extends Cercle
    ne semble pas logique. J'aurai fait l'inverse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public class Cercle extends Ovale
    car un cercle "spécialise" un ovale par le fait que le rayon du cercle est constant.

  5. #5
    Membre éprouvé Avatar de jerome.petit
    Inscrit en
    Novembre 2002
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 78
    Par défaut
    Citation Envoyé par thibaut
    Pourquoi le constructeur Ovale(Cercle c) appelle le constructeur Cercle() ???

    C'est parceque le langage spécifie qu'un constructeur d'une classe doit être appelé à chaque fois qu'une instance de cette classe ou d'une de ses sous-classes est créée.
    Comme le constructeur de Ovale n'apelle pas explicitement un constructeur de sa super-classe Cercle, à la compilation un appel à super() est ajouté au début du constructeur de Ovale. Or Cercle ne possédant pas de constructeur par défaut, une erreur de compilation survient indiquant que le symbole Cercle() n'existe pas.

    Ai-je éclairé ta lanterne ?

  6. #6
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Par défaut
    Oui c'est clair, c'est ce donc je me doutais...

  7. #7
    Membre Expert
    Avatar de viena
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    1 071
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 071
    Par défaut
    A mon avis, c'est ta facon de faire qui est pas top.
    Un ovale etend cercle. Donc un ovale est un cercle (informatiquement parlant ).
    Apparemment, quand tu ve créés un ovale, tu crées d'abord un cercle et tu contruis l'ovale en passant le cercle à ton constructeur.
    Or, tu dois directement créer ton ovale en fait :
    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
     
    public class Ovale extends Cercle {
    public Ovale (int x,int y){ 
        this.super(x,y);
      } 
    } 
     
    public class Cercle { 
      public Cercle (int x,int y){ 
        monAbscisse = x; 
        monOrdonnee = y; 
      } 
     
      int monAbscisse; 
      int monOrdonnee;
    }

  8. #8
    Invité
    Invité(e)
    Par défaut thx
    Merci tout le monde (specialement jerome.petit qui a resolu mon probleme :>)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [debutant] Probleme d heritage
    Par Treuze dans le forum Débuter
    Réponses: 20
    Dernier message: 21/04/2006, 12h46
  2. [DEBUTANT] TSqlQuery & requête simple
    Par fred64 dans le forum Bases de données
    Réponses: 3
    Dernier message: 21/04/2004, 11h35
  3. [debutant]probleme servlet
    Par noOneIsInnocent dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 26/09/2003, 13h25
  4. [langage] Problème tout simple
    Par marouanitos dans le forum Langage
    Réponses: 5
    Dernier message: 24/09/2003, 11h25
  5. [debutant] Probleme pour dessiner un simple cube
    Par scorpiwolf dans le forum DirectX
    Réponses: 6
    Dernier message: 02/07/2003, 20h29

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