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 Delphi Discussion :

Précisions sur l'Override


Sujet :

Langage Delphi

  1. #1
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut Précisions sur l'Override
    Bonjour tous,
    je me posais une question sur l'overload. Je pense que j'ai compris mais demande l'avis de personnes qui connaissent vraiment pour être sûr.

    Imaginons que j'ai deux classes, une mère avec GetNom en virtual et une fille avec GetNom, sans override.

    Si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    UneMere : TMere;
    UneMere:=TMere.create;
    UneMere.GetNom; // appel de GetNom de la mère
     
    UneFille : TFille;
    UneFille:=TFille.create;
    UneFille.GetNom; // appel de GetNom de la fille
     
    UneFille : TMere;
    UneFille:=TFille.create;
    UneFille.GetNom; // appel de GetNom de la mère.
    Et si je refais le même code en mettant override sur la méthode de la fille, la seule chose qui change, c'est le dernier cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UneFille : TMere;
    UneFille:=TFille.create;
    UneFille.GetNom; // appel de GetNom de la fille.

    Je tappe juste ou non ?
    Manque-t-il des précisions ou des cas ?

  2. #2
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  3. #3
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    Tu auras un avertissement à la compilation : La méthode 'GetNom' cache la méthode virtuelle du type de base 'TMere'. Consulte l'aide en ligne de ce message pour avoir toutes les précisions.

    Bloon
    A lire : Les règles du club
    Delphi : La FAQ - Articles

  4. #4
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    Cas d'utilisation d'override :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MaClassMere = class ....
      procedure Machin;virtual;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MaClassFille = class(MaClassMere)
      procedure Machin;override;
    Car la déclaration de procédure est identique à l'ancêtre. Cela permet de ne pas recouvrir la méthode ancêtre.



    Cas d'utilisation de reintroduce
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MaClassMere = class ....
      procedure Machin;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MaClassFille = class(MaClassMere)
      procedure Machin;reintroduce;
    Ceci veut dire que l'on recouvre la méthode mère (pratique lorsque cette dernière n'est pas virtual ou dynammic)


    Dans ces deux premiers cas, afin de ne pas faire disparaitre la méthode ancêtre, il faut penser à l'appeler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure Machin;
    begin
    inherited; // appelle la procedure machin de l'ancetre.
     
    // puis traitement des données
    ...
     
    end;




    Cas d'utilisation de overload (n'a rien a voir avec les précédents)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    MaClassMere = class ....
      function IsValid(sText : string);boolean;overload;
      function IsValid(iEntier : integer);boolean;overload;
      function IsValid(iNominateur, iDenominateur : integer);boolean;overload;
    Cela permet d'avoir deux fonctions au nom identique mais avec des paramètres diférents.


    Voila, j'espère que t'y vois un peu plus clair...

    A+
    CV :
    - LinkedIn
    - Viadeo

  5. #5
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Pascal Jankowski, si ça marche mais comme j'avais tout programmé et que je devais retourner parfois un int parfois un string, parfois un bool, j'ai fait autrement.

    Merci pour votre aide, mais ce que je ne comprends c'est que vous me conseillez tous donc de mettre à chaque fois override dans la classe fille pour qu'on appelle la méthode de la classe fille mais quand je regarde le code de mon collègue, souvent il ne met pas de override et cela marche très bien.

  6. #6
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    Le plus important est de mettre inherited dans la procedure afin d'être sur que l'ancetre soit exécuté.

    L'utilisation d'override ou de reintroduce est fortement recommandé, dans le cas contraire une exception est levé.
    CV :
    - LinkedIn
    - Viadeo

  7. #7
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    Si une méthode est déclarée virtual dans une classe mère il est très fortement recommandé de la déclarer override si elle est redéfinie dans une classe fille ou 'reintroduce' pour indiquer explicitement qu'on ne l'override pas. Aucune exception n'est levée si on omet override, on a juste un message d'avertissement à la compilation.

    Si on ne le fait pas, on perd le comportement polymorphique et c'est une faute de programmation, rendant le code peu fiable et peu maintenable.

    Bloon
    A lire : Les règles du club
    Delphi : La FAQ - Articles

  8. #8
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Ok merci pour ces indications, je vais repasser toutes les fonctions du coup.

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

Discussions similaires

  1. Précision sur Oracle 9iAS r2
    Par Patmane dans le forum Oracle
    Réponses: 9
    Dernier message: 18/03/2007, 04h41
  2. Précisions sur les recordset DAO
    Par Igricheff dans le forum VBA Access
    Réponses: 2
    Dernier message: 18/01/2005, 17h16
  3. Précisions sur Import/export
    Par electro dans le forum Import/Export
    Réponses: 9
    Dernier message: 15/10/2004, 13h34
  4. [Observateur] Précisions sur le design pattern Observer [UML]
    Par joquetino dans le forum Design Patterns
    Réponses: 2
    Dernier message: 07/10/2004, 22h35
  5. Précision sur les sauvegarde à chaud
    Par alxkid dans le forum Administration
    Réponses: 2
    Dernier message: 09/08/2004, 18h55

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