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

Delphi Discussion :

Overload et Override (définition de nouveaux constructeurs)


Sujet :

Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 28
    Points : 25
    Points
    25
    Par défaut Overload et Override (définition de nouveaux constructeurs)
    Bonjour,

    Pour un projet, j'ai besoin d'étendre une classe delphi (TComPort en l'occurence) afin de répondre à mes besoins. J'utilise donc la clause override sur le constructeur de ma classe. Ensuite je voudrais surcharger ce constructeur afin qu'il prenne en compte les extentions apportés.

    J'utilise donc le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    type
      TComPortAT = class(TComPort)
     
    public
        constructor Create(AOwner: TComponent); overload; override;
        constructor Create(AOwner: TComponent; dt: longint; dr: integer); overload;
    qui me fournit le warning suivant sur le 2ème constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [Avertissement] ComPortAT.pas(24): W1010 La méthode 'Create' cache la méthode virtuelle du type de base 'TCustomComPort'
    Quelqu'un aurait des explications sur ce warning ? ou quelle syntaxe adopter afin de ne pas l'avoir ?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    constructor Create(AOwner: TComponent);overload;override; 
    constructor Create(AOwner: TComponent; dt: longint; dr: integer);reintroduce;overload;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    constructor TComPortAT.Create(AOwner: TComponent);
    begin
      inherited;
     -----

  3. #3
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Ca fait pas de warning ce nouveau code ?
    du fait que la méthode create aux paramétres initiaux n'a pas d'override ?

    est-ce qu'il ne serait pas suffisant de redeclarer uniquement le create avec un re-introduce, puis un override dans ce style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     type
      TComPortAT = class(TComPort)
     
    public
        constructor Create(AOwner: TComponent; dt: longint; dr: integer); reintroduce; override;
    puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     constructor MaForm.Create(AOwner: TComponent; dt: longint; dr: integer);
    begin
      inherited create( AOwner); 
      ...
    end


    J'ai pas testé mais c'est ce qui me parait logique
    1. on redefinit la méthode create avec des paramatres supplémentaire
    2. on la surcharge par rapport à l'ancetre
    3. le inherited tient compte des ancien params

    NON testés, il y a surement des réglages syntaxiques à faire
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    Aucun warning!
    Je viens de corriger.

    Ton nouveau code ne convient pas.
    Il souhaite surcharger le constructor hérité et proposer un 2ème constructeur
    avec des paramètres différents.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 28
    Points : 25
    Points
    25
    Par défaut
    Merci à vous 2 !
    L'usage de la directive reintroduce (que je ne connaissais pas) a permis de résoudre mon problème.

  6. #6
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    comme quoi

    @Fabrice
    mais dans ton create overloadé il faut soit faire

    - "create( AOwner )"

    - soit "inherited Create( AOwner )"

    pour garder une bonne init.
    Le 1er cas est le mieux, car on peut placer du code dans le create non overloadé et permet de faire une init "standard" sans les param supplémentaires.

    Si aucun code n'est dans le create non overloadé, et que le code que j'ai posté fonctionne (à tester), c'est peut être plus logique de ne pas overloader le create et de ne garder qu'un Create (avec les param supplémentaire).

    Qu'en pense tu ?

    :EDIT:
    J'ai lu ta correction après mon post
    tu as donc choisis le 2eme cas

    ET tu as ajouté le override au create non overloadé (c'est a ceci que je pensais pour le warning )
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

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

Discussions similaires

  1. Multiple définition de mon constructeur perso
    Par antoine974 dans le forum C++/CLI
    Réponses: 3
    Dernier message: 16/11/2010, 21h18
  2. Problème définition constructeur
    Par bugland dans le forum Langage
    Réponses: 11
    Dernier message: 12/02/2007, 14h34
  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