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 :

[Question bête] Problème d'héritage et de cast


Sujet :

Langage Java

  1. #1
    BiM
    BiM est déconnecté
    Expert confirmé
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Par défaut [Question bête] Problème d'héritage et de cast
    Bonjour,

    Je vais essayer de vous exposer mon probème simplement.

    Dans une classe Principale, je récupère un objet de type Mere via une méthode d'une autre classe Creatrice, mais je voudrais caster celui-ci de sorte à l'avoir de type Fille (Fille hérite de Mere) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Principale {
      public Principale() {
        Creatrice create = new Creatrice();
        Fille objetRecupere = (Fille)create.getAttribut();
        objetRecupere.setPere("Papa");
      } 
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Creatrice {
      private Mere attribut = null;
      public Creatrice() {
        this.attribut = "Maman";
      }
      public Mere getAttribut() {
        return this.attribut;
      }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Mere {
      private String nomMere = null;
      private setMere(String nomMere) {
        this.nomPere = nomPere;
      } 
      private String getMere() {
        return this.nomMere;
      } 
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Fille extends Mere {
      private String nomPere = null;
      private void setPere(String nomPere) {
        this.nomPere = nomPere;
      } 
      private String getPere() {
        return this.nomPere;
      } 
    }
    Bien évidemment, l'utilisation est bien plus complexe qu'il n'en paraît. Dans ce cas, je ne pas modifier les classes :
    - Mere
    - Creatrice
    Et je peux modifier les classes :
    - Fille
    - Principale

    Avez-vous une idée de comment résoudre ce problème de cast ?
    Je pensais faire un constructeur de Fille auquel on passe en paramètre un objet Mere mais je ne dois pas dupliquer (ou en tout cas éviter) l'objet. Enfin bon je vois pas trop comment faire

  2. #2
    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
    Est-ce que Mere as besoin d'être une classe concréte ?

    Sinon tu fais ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     public interface Linked {
      void setPere(String nomPere);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public abstract class Mere implements Linked {
      private String nomMere = null;
      private setMere(String nomMere) {
        this.nomPere = nomPere;
      }
     
      private String getMere() {
        return this.nomMere;
      }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Fille extends Mere {
      private String nomPere = null;
     
      private void setPere(String nomPere) {
        this.nomPere = nomPere;
      }
     
      public String getPere() {
        return this.nomPere;
      }
    }

  3. #3
    BiM
    BiM est déconnecté
    Expert confirmé
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Par défaut
    Oui absolument, de toute façon je ne peux pas la modifier.

    Par contre je pourrais ajouter un constructeur dans Fille de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public Fille(Mere maman) {
      this = maman; //Ce qui est impossible à faire comme ceci... et autrement, est-ce possible ?
    }

  4. #4
    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
    Je ne vois pas en quoi ça éviterait le cast ?

    Le souci c'est que ta Factory te renvoie un classe générique et tu tu veux essayer d'accéder à une méthode de ta sous-classe.

  5. #5
    BiM
    BiM est déconnecté
    Expert confirmé
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Par défaut
    Je ne veux pas éviter le cast, je veux le faire justement ou trouver un moyen de le contourner.

  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
    Citation Envoyé par BiM
    Je ne veux pas éviter le cast, je veux le faire justement ou trouver un moyen de le contourner.
    Le comprend la différence entre "éviter le cast" et "trouver un moyen de le contourner" désolé.

  7. #7
    BiM
    BiM est déconnecté
    Expert confirmé
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Par défaut
    Je te réexplique. J'aimerais faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fille objetRecupere = (Fille)create.getAttribut();
    Or create.getAttribut() renvoie un objet de type Mere.
    Fille hérite de Mere.
    Mais l'objet renvoyé (de type Mere) refuse de se caster (en Fille).

    Normal.. C'est un principe fondamental en Java.

    Or j'aimerais pouvoir le faire quand même. Mais ne pouvant pas passer par le cast directement, j'essaye de trouver une autre solution. Sachant que dans mon cas, je ne peux modifier que la classe Fille et la classe Principale.

    Suis-je plus clair ?

  8. #8
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Tu peut rajouter un constructeur à ta classe Fille qui prend une Mere en paramètre.

    Tu coup
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fille objetRecupere = (Fille)create.getAttribut();
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fille objetRecupere = new Fille(create.getAttribut());
    [edit]
    j'avais pas fait gaffe que tu avais déjà parlé de cette solution.
    Elle ne te convient pas ?
    [/edit]
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  9. #9
    BiM
    BiM est déconnecté
    Expert confirmé
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Par défaut
    Exactement ce que j'aimerais faire mais je ne vois pas ce que je met comme code dans le constructeur

  10. #10
    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
    Citation Envoyé par BiM
    Mais l'objet renvoyé (de type Mere) refuse de se caster (en Fille)
    Je vois pas pourquoi l'objet refuserai de se caster. Au pire tu obtiens une ClassCastException mais la compilation passe.

  11. #11
    BiM
    BiM est déconnecté
    Expert confirmé
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Par défaut
    Heu oui ben voila (désolée moi et le Java), j'ai une ClassCastException.

  12. #12
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Il faudrait que ta classe Mere est un constructeur par copie (au moins protected).

    Puis dans ta classe Fille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public Fille(Mere mere) {
        super(mere);
    }
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  13. #13
    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
    Citation Envoyé par BiM
    Heu oui ben voila (désolée moi et le Java), j'ai une ClassCastException.
    Oui mais le problème c'est que ta classe Mere renvoyée, n'est pas effectivement de type classe Fille donc tu ne pourras jamais appeler la méthode de classe Fille dessus (meme avec cast ou pas cast ou toutes les rustines du monde)...

  14. #14
    BiM
    BiM est déconnecté
    Expert confirmé
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Par défaut
    Citation Envoyé par le y@m's
    Il faudrait que ta classe Mere est un constructeur par copie (au moins protected).

    Puis dans ta classe Fille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public Fille(Mere mere) {
        super(mere);
    }
    Mhhh, en gros il reprendrais tous les attributs et les recopieraient (parce qu'il y en a un certain nombre quand même) ?

    Citation Envoyé par thibaut
    Oui mais le problème c'est que ta classe Mere renvoyée, n'est pas effectivement de type classe Fille donc tu ne pourras jamais appeler la méthode de classe Fille dessus (meme avec cast ou pas cast ou toutes les rustines du monde)...
    D'où je ne peux pas caster, ce que je dis depuis le début. Et d'où j'essaye de trouver un autre moyen.

  15. #15
    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 mais on ne peut pas modifier Mere grrrr.

  16. #16
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Citation Envoyé par BiM
    Mhhh, en gros il reprendrais tous les attributs et les recopieraient (parce qu'il y en a un certain nombre quand même) ?
    Oui c'est ça ^^
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  17. #17
    BiM
    BiM est déconnecté
    Expert confirmé
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Par défaut
    Au pire des cas, je crois que je vais enlever l'héritage à fille et lui mettre Mere en attribut, comme ca, ce sera réglé, mais bon, c'est dommage l'héritage fait est plus propre.

  18. #18
    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
    Ou simplement un pointeur sur la classe Mere dans la classe Fille:

    Et a mon avis l'héritage ne sers à rien, puisque tu ne l'utilises pas.

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    public class Fille {
      private String nomPere = null;
      private Mere mere = null;
    
      public Fille(Mere mere) {
        super();
        this.mere = mere
      }
     
      private void setPere(String nomPere) {
        this.nomPere = nomPere;
      }
     
      public String getPere() {
        return this.nomPere;
      }
    
      // Methode déléguées
      private setMere(String nomMere) {
        this.mere.nomPere = nomPere;
      } 
    
      private String getMere() {
        return this.mere.nomMere;
      }
    }

  19. #19
    BiM
    BiM est déconnecté
    Expert confirmé
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Par défaut
    J'ai réduit mon code mais t'inquiete pas que je l'utilise ce fameux héritage. (Au passage tu viens de répéter ce que j'ai dit )

  20. #20
    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
    Citation Envoyé par BiM
    Au pire des cas, je crois que je vais enlever l'héritage à fille et lui mettre Mere en attribut, comme ca, ce sera réglé, mais bon, c'est dommage l'héritage fait est plus propre.
    Certes l'héritage est propre mais il ne sert à rien, puisque dans Createur tu crées un objet de type Mere et non Fille...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. petite question sur l'héritage et les cast
    Par baedal dans le forum Langage
    Réponses: 3
    Dernier message: 29/02/2008, 00h48
  2. [MFC] Question bête sur les CListBox
    Par gwendo dans le forum MFC
    Réponses: 1
    Dernier message: 10/08/2005, 16h43
  3. Problème d'héritage d'une méthode protégée
    Par shenron666 dans le forum C++
    Réponses: 9
    Dernier message: 28/04/2005, 23h17
  4. [Ethereal] Questions et problèmes de connexion
    Par Nasky dans le forum Développement
    Réponses: 8
    Dernier message: 04/03/2005, 00h53
  5. Numéro auto ===== Question bête
    Par Nicos77 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 16/06/2003, 13h04

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