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 :

Surcharge d'une classe interne d'une classe héritée


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 35
    Par défaut Surcharge d'une classe interne d'une classe héritée
    Bonjour,

    J'essaye de définir une classe Modele qui doit me servir pour différentes classes qui devraient en hériter et comportant une classe interne de la façon suivante :

    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
    19
    public class Modele {
       private ClasseInterne monObjCI;
     
       private class ClasseInterne {
     
          public ClasseInterne() {
             super();
          }
     
       }
     
       public getMonObjCI() {
          return monObjCI;
       }
     
       public Modele() {
          super();
          this.monObjCI = new ClasseInterne();
    }
    Et dans chacune de mes classes héritées, je n'aurais "plus qu'à" redéfinir ma classe interne spécifique à chacune de mes classes comme celà :

    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 ClasseHeritee extends Modele {
       private class ClasseInterne {
          private int monChamp1;
          private String monChamp2;
     
          public setMonChamp1 (int monChamp1) {
             this.monChamp1 = monChamp1;
     
          public setMonChamp2 (String monChamp2) {
             this.monChamp2 = monChamp2;
     
       }
    }
    Le problème est que je n'arrive pas à affecter les différentes valeurs à mes champs dans un objet de la classe héritée de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ClasseHeritee monObj = new ClasseHeritee();
    // Je pensais faire comme celà mais ça ne fonctionne pas !!!
    monObj.getMonObjCI().setMonChamp1(3);
    Et peut on réellement le faire de cette façon ?

    D'avance merci.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 586
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 586
    Par défaut
    Citation Envoyé par 3Fred9 Voir le message
    Et peut on réellement le faire de cette façon ?
    Non. On ne peut pas redéfinir une classe, on ne peut redéfinir que des méthodes.

    Cela ne s'appelle pas non plus de la surcharge, mais juste un masquage. Une classe A qui porte le même nom qu'une autre classe B, empêche juste de voir B là où on voit A. Il n'y a pas de lien entre les deux, elles ont juste le même nom et donc ce nom ne peut désigner qu'une seule des deux.

    Pour faire ce que tu demandes, tes classes internes doivent elles aussi hériter d'une classe commune. Elles seront alors libres d'avoir leurs propres méthodes, et de redéfinir les méthodes communes s'il y en a.

    Chaque classe qui hérite de Modele peut redéfinir getMonObjCI() de sorte que ça renvoie le bon type.

    Et l'instance de ClasseInterne à utiliser, pourrait être passée par le constructeur des classes filles de Modele, au constructeur de Modele, qui donc ne se charge pas de l'instancier lui-même. Cela permet à chaque classe fille d'avoir chacune son propre type de classe interne, et de l'exposer au monde.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 35
    Par défaut
    Merci pour cette première réponse.

    Si j'ai tout compris, ce qui m'étonnes car j'ai encore un problème . Je sors donc la classe interne pour en faire une classe à part entière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class ClasseDuModele {
       public ClasseDuModele() {
          super();
       }
    }
    Ma classe Modele devient donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class Modele {
       public ClasseDuModele monObjCI;
    }
    Ma classe fille devient donc :

    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 ClasseHeritee extends Modele {
       public class ClasseInterne extends ClasseDuModele {
          private int monChamp1;
          private String monChamp2;
     
          public ClasseInterne(int monChamp1, String monChamp2) {
             this.monChamp1 = monChamp1;
             this.monChamp2 = monChamp2;
       }
     
       public ClasseHeritee(ClasseInterne monObjCI) {
          super();
          this.monObjCI = monObjCI;
       }
    }
    Et dans l'utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ClasseInterne monObjInterne = new ClasseHeritee.ClasseInterne(1, "Bonjour");
    ClasseHeritee monObj = new ClasseHeritee(monObjInterne);
    Or là j'ai le problème sur le new ClasseHeritee.ClasseInterne qui si je comprends bien me demande q'une instance de ClasseHeritee existe afin d'appeler le constructeur de ClasseInterne or le constructeur de ClasseHeritee a besoin de monObjInterne donc je tourne en rond....

    Puis ce que j'ai du mal à saisir c'est comment monObjetInterne puisse passer de type ClasseDuModele au type ClasseInterne sans aucune surcharge ???


    D'avance merci.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 586
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 586
    Par défaut
    Citation Envoyé par 3Fred9 Voir le message
    Je sors donc la classe interne pour en faire une classe à part entière :
    T'étais pas obligé, hein. Ça marche, mais rien ne t'y oblige. On peut tout-à-fait étendre une classe interne.

    Citation Envoyé par 3Fred9 Voir le message
    Et dans l'utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ClasseInterne monObjInterne = new ClasseHeritee.ClasseInterne(1, "Bonjour");
    ClasseHeritee monObj = new ClasseHeritee(monObjInterne);
    Euh, non, plutôt revoir le constructeur de ClasseHeritee :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public ClasseHeritee() {
      super(makeMonObjInterne());
    }
     
    private ClasseInterne makeMonObjInterne() {
      this.monObjInterne = new ClasseInterne();
      return this.monObjInterne;
    }
    Et encore, si ça se trouve tu as pas besoin de l'envoyer au super() pour la classe mère. Auquel cas, c'est bien plus simple.


    Citation Envoyé par 3Fred9 Voir le message
    Puis ce que j'ai du mal à saisir c'est comment monObjetInterne puisse passer de type ClasseDuModele au type ClasseInterne sans aucune surcharge ???
    Parce que toutes les classes filles feront un appel de new LaClassInterneDeCetteFille()
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 35
    Par défaut
    OK ça marche nickel !!!!

    Merci encore à toi

  6. #6
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 35
    Par défaut Suite...
    De nouveau bonjour,

    Alors cette fois j'ai un petit soucis au niveau du contructeur pour une autre classe interne, je m'explique...

    J'ai donc ma classe Modele suivante (avec une deuxième classe interne que j'ai du coup repassé à l'intérieur de ma classe Modele)

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    public class Modele {
       protected int monAttribut;
       public ClasseDuModele1 monObjCi1;
       public ClasseDuModele2 monObjCi2;
     
       public class ClasseDuModele1 {
          public ClasseDuModele1() {
             super();
          }
       }
     
       public class ClasseDuModele2 {
          public ClasseDuModele2() {
             super();
          }
       }
     
       public Modele(int monAttribut) {
          super();
          this.monAttribut = monAttribut;
       }
     
       public void maMethode() {
          this.monObjCi2 = new ClasseDuModele2();
       }
     
    }
    Puis ma classe héritée suivante :

    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
    19
    20
    21
    22
    23
    24
    public class ClasseHeritee extends Modele {
       public class ClasseInterne1 extends ClasseDuModele1 {
          private int monChamp1Ci1;
          private String monChamp2Ci1;
     
          public ClasseInterne1(int monChamp1Ci1, String monChamp2Ci1) {
             super();
             this.monChamp1Ci1 = monChamp1Ci1;
             this.monChamp2Ci1 = monChamp2Ci1;
       }
     
       public class ClasseInterne2 extends ClasseDuModele2 {
          private int monChampCi2;
     
          public ClasseInterne2(int monChampCi2) {
             super();
             this.monChampCi2 = monChampCi2;
       }
     
       public ClasseHeritee(int monChamp1Ci1, String monChamp2Ci1) {
          super();
          this.monObjCi1 = new ClasseInterne1(monChamp1Ci1, monChamp2Ci1);
       }
    }
    Et donc l'utilisation de la classe héritée de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    monObj = new ClasseHeritee(1, "Bonjour");
    monObj.maMethode();
    monObj possède bien un objet monObjCi1 de ClasseInterne1 (qui est construit dans le constructeur de ClasseHeritee...

    Par contre mon problème se trouve dans la construction de monObjCi2 qui se construit dans la fonction maMethode de la classe Modele qui est construit suivant la classe ClasseDuModele2 et non ClasseInterne2

    Je pensais que le fait d'appeler maMethode sur monObj (de classe ClasseHeritee) allait automatiquement prendre en surcharge le contructeur de ClasseInterne2 au lieu de ClasseDuModele2 mais ce n'est pas le cas...

    Y aurait il donc un moyen de réaliser ceci ? Ou bien ai je mal définit maMethode ?

    Encore merci pour votre aide...

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

Discussions similaires

  1. Réponses: 14
    Dernier message: 10/02/2007, 14h27
  2. Class interne dans une classe template
    Par MatRem dans le forum Langage
    Réponses: 26
    Dernier message: 15/06/2006, 11h45
  3. [AS2] Atteindre attribut d'une classe depuis une fonction interne a la classe
    Par Demco dans le forum ActionScript 1 & ActionScript 2
    Réponses: 6
    Dernier message: 18/04/2006, 22h03
  4. [POO] Classe interne à une classe, est ce possible ?
    Par Matth_S dans le forum Langage
    Réponses: 13
    Dernier message: 10/02/2006, 11h24
  5. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 22h24

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