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 :

Overloading vs overriding


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Autre
    Inscrit en
    Décembre 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Autre
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2017
    Messages : 2
    Par défaut Overloading vs overriding
    Bonjour,

    Première question pour moi sur ce forum, j'espère la poser au bon endroit...

    J'étudie en ce moment la POO avec Java (mais j'en fais aussi un peu avec du code .NET sur lequel un collègue et moi, tous deux amateurs dans ce domaine, bossons).

    Dans du code que nous avons écrit par le passé, nous avons une classe mère, et plusieurs classes filles. La classe mère contient des méthodes, dont le comportement varie en fonction de la classe fille à laquelle appartient l'objet (de fait, nous n'instancions jamais directement d'objet de la classe mère, mais comme nous ignorions le concept de classe abstraite, nous ne l'avions pas formalisé).

    Dans notre code, la méthode dans la classe mère peut ressembler à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public ClasseMere MaMethode() {
        if (me instanceOf classeFille1) {
            return ((classeFille1) me).MaMethode();
        } else if (me instaceOf classeFille2) { 
            return ((classeFille2) me).MaMethode();
        } else if [...] 
    }
    et dans les classes filles nous avons :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public ClasseFille MaMethode() {
        [...]
    }
    Si je devais écrire cela à la lecture de mes cours de POO, je ferais en sorte d'avoir une classe mère abstraite, cette méthode y étant déclarée mais pas implémentée.
    Cette méthode serait ensuite implémentée dans les classes filles.

    Ma question étant donc : cela peut il avoir un impact notable en termes de performance ?
    Dans le premier cas, on a systématiquement un appel imbriqué de deux méthodes et un ou plusieurs casts.
    Dans le second cas, j'imagine que le runtime doit résoudre à l'exécution la classe fille pour appeler la bonne méthode sur l'objet.

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Côté perf ce serait probablement plus performant qu'une succession d'instanceof...

    Mais c'est pas vraiment le problème et c'est même une erreur de penser performance à ce niveau là.
    Il faut privilégier la lisibilité du code !


    Sinon en lieu et place d'une classe abstraite, tu pourrais utiliser directement une interface, bien moins contraignant.

  3. #3
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Personnellement, je trouve que c'est un non sens de définir le code de la méthode dans la classe mère alors que ce code est dépendant de la classe fille et oblige à faire des cast dans tous les sens...
    C'est donc logiquement dans la classe fille qu'elle doit être implémentée.
    Rien n'empêche, avec une classe abstraite, de définir la signature de la méthode pour obliger les classes filles de les implémenter.
    Du coup, on peut utiliser le type de la classe abstraite pour exécuter la méthode sur des instances des 2 types plutôt que de faire un cast.
    On serait un peu dans la logique d'une interface mais bon, s'il y a du code commun, la méthode dans la classe abstraite aurait du sens, un truc comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public abstract ClassMere
    {
       protected Integer propriete1;
       protected String propriete2;
     
       public void maMethodeCommune(...)
       {
          un traitement quelconque qui positionne des propriétés par exemple...
       }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public MaClasse1 extends ClassMere
    {
       public void maMethodeCommune(...)
       {
          super.maMethodeCommune(...);
     
          des traitements spécifiques à cette classe...
       }
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Override / Overload
    Par Bleys dans le forum Delphi
    Réponses: 2
    Dernier message: 28/02/2007, 20h01
  2. Réponses: 5
    Dernier message: 17/05/2006, 11h33
  3. [VB.NET]Comment correctement utiliser Overrides/Overloads?
    Par NicolasJolet dans le forum VB.NET
    Réponses: 5
    Dernier message: 21/03/2006, 10h39
  4. [OO] override overload
    Par eponette dans le forum Langage
    Réponses: 9
    Dernier message: 10/02/2006, 15h21
  5. [Traduction] Overload et Override en français ?
    Par vbrabant dans le forum Langage
    Réponses: 3
    Dernier message: 11/08/2005, 18h44

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