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 :

heritage probleme déclaration


Sujet :

avec Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    541
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 541
    Points : 124
    Points
    124
    Par défaut heritage probleme déclaration
    Bonjour,

    J'ai une classe B qui hérite de A.

    A possède une méthode ajout(int i, int j)


    Si dans la classe B, je déclare la même méthode même arguments mais modification dans la méthode .

    Laquelle sera appelé si je suis dans la classe B?

    Car je possède des codes mutualisé se trouvant dans des méthodes mais dépend de la classe où je les appelle?
    Merci.

  2. #2
    Membre régulier
    Inscrit en
    Novembre 2010
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 221
    Points : 92
    Points
    92
    Par défaut heritage probleme déclaration
    slt ce donc tu te propose de fait est appelle une surcharge car tu réécrit le code d'une méthode hérite dans ta classe B . Donc dans B et pour les autres classe qui hériterons aussi sa serra ta nouvelle méthode ajout qui sera appelle.
    a++

  3. #3
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    Citation Envoyé par narutoe Voir le message
    slt ce donc tu te propose de fait est appelle une surcharge
    Java a une terminologie précise dans ses specs:

    si il existe une méthode m(int arg) dans classe A:

    - si on définit par exemple m(int arg, String c) on a une surcharge (terme officiel en anglais overloading )

    - si dans B extends A on a m(int arg) on a une spécialisation (terme officiel en anglais overriding)
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    541
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 541
    Points : 124
    Points
    124
    Par défaut
    Prenons un exemple:

    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
    28
    29
     
    public class A{
     
    public void ajout(int i,int j{
     
    System.out.println(""+(i+j));
    affiche(i+j);
    }
     
    public void affiche(int r){
     
    System.out.println("résultat1="+r);
    }
     
    }
     
     
    public class B extends A{
     
    public B(){
    ajout(a,b);
    }
     
    public void affiche(int r){
     
    System.out.println("résultat2="+r);
    }
     
    }

    Quel méthode affiche sera appelé ?

  5. #5
    Membre confirmé
    Homme Profil pro
    IUT Informatique
    Inscrit en
    Mars 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : IUT Informatique

    Informations forums :
    Inscription : Mars 2011
    Messages : 412
    Points : 486
    Points
    486
    Par défaut
    Si je me trompe pas, c'est la méthode de ta class A qui sera utiliser.
    T'appel ajout de ta class A, et cette méthode appel une méthode affiche, et elle connait que celle de ta class A.

  6. #6
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Points : 13 670
    Points
    13 670
    Par défaut
    Il va prendre celle à côté donc de la classe A. En plus dans la sur-classe, pas de question à se poser, il appellera forcément la méthode de cette classe. Il faut te dire que A n'a pas connaissance qu'il existe une sous-classe d'elle-même.

    La question se pose plutôt dans le cadre de la sous-classe. Car elle a connaissance qu'il existe une sur-classe au dessus elle. Si la méthode "affiche()" de la classe B n'existe pas. Si B appelle affiche(), là c'est la méthode de la classe A qui va être appelé.
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Architecte Solution
    LinkedIn : https://www.linkedin.com/in/nicolascaudard/

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    294
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 294
    Points : 268
    Points
    268
    Par défaut
    Pourquoi tu fais pas seulement un petit essaye pour voir quelle méthode sera appelé

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    541
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 541
    Points : 124
    Points
    124
    Par défaut
    Je n'ai pas de compilateur sur moi je suis sur un téléphone mobile.

    Si je crée une classe C auquel je crée une instance de la classe B et je fais appel à affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    B b=new B();
    b.affiche(6);
    Quel méthode sera appelé?

  9. #9
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Points : 13 670
    Points
    13 670
    Par défaut
    L'objet instancié est de type B. Du coup il faut chercher la méthode affiche() la plus proche dans cette classe B. C'est la méthode de la classe B qui va être appelé.
    Et là encore, s'il n'y avait pas de méthode affiche() dans la classe B, ça serait la méthode affiche() un cran au dessus qui serait appelée et donc la méthode de la classe A.


    En fait le principe est le suivant. Tu regardes de quel type ton objet est instancié. A partir de ce moment tu regardes si la méthode existe dans l'objet instancié. Si elle n'existe pas, tu remontes la pile des sur-classe jusqu'à arriver à la plus proche ayant cette fonction.
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Architecte Solution
    LinkedIn : https://www.linkedin.com/in/nicolascaudard/

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    541
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 541
    Points : 124
    Points
    124
    Par défaut
    Comment faire afin d'éviter de réécrire des lignes de codes identiques d'ajouter une ligne en fonction de la classe qui la appelée ?

  11. #11
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Points : 13 670
    Points
    13 670
    Par défaut
    J'ai pas compris ta phrase mais je tente une réponse tout de même.

    De ce que je comprends, tu veux redéfinir une fonction mais sans devoir la réecrire entièrement. Sulement en rajoutant le comportement supplémentaire.

    Si c'est ça que tu veux, tu le fais comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class SuperClasse {
      public void afficher() {
        System.out.println("traitement de base");
      }
    }
    
    public class SousClasse extends SuperClasse{
      public void afficher() {
        super.afficher(); // réutilisation du traitement de base
        System.out.println("traitement supplémentaire");
      }
    }
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Architecte Solution
    LinkedIn : https://www.linkedin.com/in/nicolascaudard/

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    541
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 541
    Points : 124
    Points
    124
    Par défaut
    sauf que je souhaiterais effectuer un traitement particulier qui ne peut se faire à la fin de la méthode.

  13. #13
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    pour l'appel, il existe en java le "dynamic method dispatch", utilisé par tout appel à une méthode pouvant potentiellement être spécialisée. Il suffit de dire qu'une méthode privée ou qu'une méthode statique ne peux pas être spécialisée dans une sous classe pour faire la distiction entre les deux cas d'appel possible

    Ensuite pour votre cas d'une méthode X dont le comportement serait légèrement différent d'une sous classe à l'autre, il faut que X appelle une autre méthode (appelon la Y) non privée qui implémente le comportement variable. Chaque sous classe réécrira alors la méthode Y.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    541
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 541
    Points : 124
    Points
    124
    Par défaut
    Avez vous un exemple à me proposer s'il vous plait?

  15. #15
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class A {
        public int calcule(int a, int b, int c){
           return a+moyenne(b,c);       
        }
        protected int moyenne(int b, int c){
          return (b+c)/2;
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class B extends A {
       protected int moyenne(int b, int c){
          if (b<0)
            b=0;
          if (c<0)
            c=0;
          return (b+c)/2;
       }
    }
    Ici le comportement de 'calcule' varié d'une classe à l'autre, en déportant le calcul de la moyenne de b,c dans une autre méthode.

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    541
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 541
    Points : 124
    Points
    124
    Par défaut
    finalement il n'y a pas mieux d'utiliser un booleen afin de déterminer dans quel classe est appelé la méthode?

  17. #17
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Points : 13 670
    Points
    13 670
    Par défaut
    Citation Envoyé par jojo_ol76 Voir le message
    finalement il n'y a pas mieux d'utiliser un booleen afin de déterminer dans quel classe est appelé la méthode?
    Pourquoi faire le booléen ?

    Regarde la solution de Tchize_, il y a plusieurs avantages :
    - pas de booléen puisque le choix se fait en fonction du type de l'objet instancié (objet A ou objet B)
    - ta méthode est spécialisée à n'importe quel endroit (pas comme super.methode() qui peut limiter la possibilité)
    - le choix de la méthode utilisée est totalement transparent pour la classe utilisatrice qui ne se soucie que du résultat
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Architecte Solution
    LinkedIn : https://www.linkedin.com/in/nicolascaudard/

  18. #18
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    un booléen signifie que tu met les traitement différenciés dans le parent. Dans ce cas pourquoi faire de l'héritage, passe directement ce booléen lorsque tu construit l'objet :/

    Ce n'est pas au parent de faire le boulot de l'enfant. Faire un parent en supposant que les enfant ne feront qu'activer des flags du parent, ca limite vachement l'évolution future de la classe

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    541
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 541
    Points : 124
    Points
    124
    Par défaut
    Supposons qu'on a cela:

    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 A {
        public int calcule(int a, int b, int c){
           return a+moyenne(b,c);       
        }
        protected int moyenne(int b, int c){
     
            b=0;
          if (c<0)
            c=0;
          return (b+c)/2;
        }
    }

    Dois je écrire cela afin d'ajouter une condition à ma méthode donc réécrire le meme code que dans la classe A? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    public class B extends A {
       protected int moyenne(int b, int c){
          if (b<0)
            b=-1;
          if (c<0)
            c=0;
          return (b+c)/2;
       }
    }

  20. #20
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ben oui

Discussions similaires

  1. [VBA] Probleme déclaration de variable
    Par Léponge85 dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 11/06/2008, 15h57
  2. Probleme déclaration fonction...
    Par bixi dans le forum Langage
    Réponses: 5
    Dernier message: 30/01/2006, 20h52
  3. [SURGHARGE][HERITAGE] Probleme compilation
    Par SpongeBob dans le forum C++
    Réponses: 23
    Dernier message: 27/11/2005, 21h33
  4. [Delphi 2005 Perso] Probleme déclaration de méthode
    Par alk dans le forum Delphi .NET
    Réponses: 5
    Dernier message: 08/11/2005, 17h19
  5. [C++] Heritage - Probleme constructeur
    Par yanndublanche dans le forum Débuter
    Réponses: 2
    Dernier message: 04/08/2004, 11h17

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