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 :

Redéfinition de méthodes, aucun avertissement !


Sujet :

Langage Delphi

  1. #1
    Membre du Club Avatar de CoyotteDundee
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2008
    Messages : 54
    Points : 47
    Points
    47
    Par défaut Redéfinition de méthodes, aucun avertissement !
    Bonjour à toutes et tous,

    Une fois n'est pas coutume, c'est un code qui compile qui me pose un petit problème :-)

    Je suis occupé à rédiger un petit mémo interne sur les classes héritées de TObjectList et pour ce faire, j'ai proposé l'exemple suivant :
    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
    30
     
    TMyCLass = class
      property StringValue: string;
    end;
     
    TMyList = class (TObjectList)
      protected
        function GetItem(Index: Integer): TMyClass;
        procedure SetItem(Index: Integer; AObject: TMyClass);
      public
        function Add(AObject: TMyClass): Integer;
        function First:TMyClass; 
        function Last:TMyClass; 
        function Extract( Item:TMyClass):TMyClass;
        procedure Insert(Index: Integer; AObject: TMyClass);
        property Items[index:integer]:TMyClass read GetItem write SetItem; default;
      end;
     
    implementation
     
    { TMyList }
     
    //------------------------------------------------------------------------------
    function TMyList.Add(AObject: TMyClass): Integer;
    begin
     result := inherited add( AObject);
    end;
     
    // Etc.
    //...
    Le code compile sans aucun souci et c'est bien là mon problème ( ) : Je m'attendais à me faire reprendre par le compilateur car mes méthodes de TMyList masquent les définitions originales de TObjectList.
    Or il n' en est rien. J'ai vérifié mes options de compilation et tous les messages sont activés. Ce code compile aussi bien sous Delphi2 2006 que sous Xe2 sans aucun avertissement.

    Quelqu'un pourrait-il m'expliquer pourquoi Delphi considère ce code comme correct ? Où se situe mon erreur de compréhension ?

    Merci d'avance,

    Coyotte

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 694
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 694
    Points : 13 130
    Points
    13 130
    Par défaut
    Simplement parce que les méthodes ancêtres ne sont pas virtuelles. Ce n'est pas une surcharge mais une redéclaration et il ne peut pas y avoir d'erreur de polymorphisme dans ce cas

  3. #3
    Membre du Club Avatar de CoyotteDundee
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2008
    Messages : 54
    Points : 47
    Points
    47
    Par défaut
    Merci Andnotor,

    C'est ce que je soupçonnais un peu mais ce qui était troublant c'est que je pouvais appeler la version" inherited" de la méthode sans me faire traiter de tous les noms.

    A la lecture de ton explication, j'en déduit que la notion "inherited" s'appliquerait plus à l'objet/classe qu'à la méthode.
    Ce n'est pas la méthode Add originale de l'objet que j'appelle, mais la méthode Add de l'objet (dans le sens "classe") original.

    Merci pour ton explication,

    Coyotte

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 694
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 694
    Points : 13 130
    Points
    13 130
    Par défaut
    inherited appelle la méthode de même nom dans la classe ancêtre mais n'est pas dépendant de la déclaration.
    Virtual/override concerne spécifiquement le polymorphisme, soit la possibilité de déclarer une variable générique (une classe ancêtre) tout en pouvant l'initialiser d'un type spécifique (une classe héritée) et d'appeler de façon transparente les méthodes de ce deuxième type.

    Pour simplifier encore, inherited est un appel de méthode dans le sens ascendant (de l'héritier vers l'ancêtre) alors que Virtual/override est une recherche (avant appel) dans le sens descendant (de l'ancêtre vers l'héritier, du type déclaré vers le type réel).
    inherited n'a pas besoin que la méthode soit virtuelle comme une méthode surchargée (override) n'appelle pas forcément inherited, ce sont deux comportements différents et indépendants

  5. #5
    Membre du Club Avatar de CoyotteDundee
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2008
    Messages : 54
    Points : 47
    Points
    47
    Par défaut
    Clair, précis et concis...

    Merci !

    Coyotte

  6. #6
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par CoyotteDundee Voir le message
    Ce code compile aussi bien sous Delphi2 2006 que sous Xe2 sans aucun avertissement.
    Etant toujours (plus pour longtemps ?) sur Delphi 7, je ne peux que te donner une piste et non pas affirmer clairement les choses, mais je crois que les generiques correspondent exactement à ce que tu fais là. Ton code deviendrait tout simplement quelque chose qui ressemble à ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TMyCLass = class
      property StringValue: string;
    end;
     
    TMyList = Generics.TObjectList<TMyClass>;
    et voila, le Add / Items / ... est directement du bon type TMyClass.

  7. #7
    Membre du Club Avatar de CoyotteDundee
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2008
    Messages : 54
    Points : 47
    Points
    47
    Par défaut
    Bonjour Guillemouze,

    Merci pour ta réponse.
    En effet, les génériques correspondent exactement à ce besoin...
    Mais, parce que le code doit encore compiler sous Delphi 2006, je ne peux les utiliser, d'où ma question :-)

    Vivement Xe2 ;-)

    Coyotte

  8. #8
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Effectivement, il me semblait que c'était plus vieux que ca, mais non, ils ont été introduits en Delphi 2009 (http://www.embarcadero.com/fr/products/delphi/whats-new)

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

Discussions similaires

  1. redéfinition de méthode
    Par greg08 dans le forum Langage
    Réponses: 8
    Dernier message: 28/10/2008, 14h59
  2. Réponses: 8
    Dernier message: 01/07/2008, 23h15
  3. héritage et redéfinition de méthodes
    Par Braillane dans le forum Langage
    Réponses: 4
    Dernier message: 07/01/2007, 18h47
  4. redéfinition de méthode et invocation
    Par magedo dans le forum Langage
    Réponses: 2
    Dernier message: 05/01/2007, 19h00
  5. [JPanel][LayoutManager] redéfinition de méthodes
    Par _KB_ dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 06/06/2006, 14h22

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