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 :

Utilisation de Reintroduce | surcharge de constructeur


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 152
    Points : 61
    Points
    61
    Par défaut Utilisation de Reintroduce | surcharge de constructeur
    Bonjour,
    un topic un peu similaire à celui ci :
    je fait un nouveau composant qui herite de TComponent, et je voudrai surcharger le constructeur.
    Je me trouve face au meme warning si je n'utilise pas la directive "reintroduce".
    W1010 La méthode 'Create' cache la méthode virtuelle du type de base 'TMonComposant'
    Je voudrai avoir plus d'info sur cette directive car j'ai lu qu'elle

    "surcharge et réintroduit des paramètres différents de la méthode de son ancêtre "

    Est ce que ca ne risque pas de posser probleme si quelqu'un veut utilisé le constructeur de TComponent ???

    Merci

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 469
    Points : 24 905
    Points
    24 905
    Par défaut
    C'est une nouveaute de Delphi 6, je crois, ... assez utile, elle permet que l'on évite d'appeller directement le constructeur de notre objet ... bon, c'est vrai si l'on a de la chance ...

    j'ai énormément de reintroduce, en particulier sur le Create de Form auxquelles je passe des objets comme paramètres ... car j'oblige le passage de paramètre, ...

    Si tu veux laisser accès au constrcuteur ancêtre, tu dois le redéclarer en overload; override; ...

    J'avoue que je n'ai pas tout compris, j'ai accès au constructeur ancêtre alors que je pensais avoir fait ce qu'il fallait pour que l'on y est pas ...

    Si un connaisseur pouvait expliquer le reintroduce SVP !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 152
    Points : 61
    Points
    61
    Par défaut
    Je ne comprend pas trop ce que ca fait non plus.
    La simple utilisation d'overload suffit pour surcharger mon constructeur, mais genere ce warning.
    Je me sent moi seul merci

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 859
    Points : 11 307
    Points
    11 307
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    type
     TClicheInfos=class
       private
         FWidth: integer;
         FHeight: integer;
       public
         constructor Create; overload;
       property Width: integer read FWidth;
       property Height: integer read FHeight;
     end;
     TJpegInfos=class(TClicheInfos)
       public
         constructor Create(AName: string; AStream: TMemoryStream; AGraph : TGraphic); reintroduce; overload;
     end;
    dans ce code, la directive reintroduce me sert justement à masquer le Create de l'ancêtre car je ne veux pas qu'un utilisateur appelle TClicheInfos.Create chez un descendant

    idem dans ce code, où je cache le TObject.Create :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    type
      TdyJpegCliche=class     
        private
          FFileName: string;        // nom complet
          FInfos: TClicheInfos;     // infos relatives au cliché
        public
          constructor Create(AFileName : string; APict : TPicture; ABmp32: TBitmap32); reintroduce; overload;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    A part masquer le warning à la compilation:
    La méthode Bidule cache la méthode virtuelle de la classe de base TMaClasseDeBase
    je n'y vois personnellement aucune autre utilité.

    @+

  6. #6
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    C'est une nouveaute de Delphi 6, je crois, ... assez utile, elle permet que l'on évite d'appeller directement le constructeur de notre objet
    Non ce n'est pas possible ! Une fois qu'un membre a été déclaré publique dans un objet, il n'est pas possible d'en interdire l'accès dans les classes dérivées. C'est la même chose pour un constructeur virtuelle.

    Prenons un petit exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    type 
      TComponentClass = class of TComponent;
      TMonEdit = class(TComponent);
     
    var ComponentClass : TComponentClass;
        Cmp : TComponent;
     
    begin
      ComponentClass := TMonEdit;
      Cmp := ComponentClass.Create(nil);
    Peu importe ce qu'on met dans TMonEdit, on ne pourra jamais interdire le code précédent de compiler et de s'exécuter. C'est même d'ailleur la seule utilité que je vois aux constructeurs virtuelles.

    Le reintroduce sert uniquement à supprimer le warning lorsqu'on définit une méthode non virtuelle qui porte le même nom qu'une méthode virtuelle des classes ancêtre. Sa sert à dire au compilateur : "ta gueule, c'est moi qui code, je sais ce que je fait".

    Petit extrait de l'aide en ligne :
    Reintroduce

    La directive reintroduce supprime les avertissements du compilateur informant qu'une méthode virtuelle précédemment déclarée est masquée. Par exemple,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     procedure DoSomething; reintroduce;   // la classe ancêtre a aussi une méthode DoSomething
    Utilisez reintroduce quand vous voulez masquer une méthode virtuelle héritée avec une nouvelle méthode.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 152
    Points : 61
    Points
    61
    Par défaut
    Quel est l'interet du warning alors si quelque chose a était concu pour le virer ?

  8. #8
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    Quel est l'interet du warning alors si quelque chose a était concu pour le virer ?
    De t'avertir pour le cas où tu aurais tout simplement oublié de mettre un override...

    Ou encore si n'a pas fait attention qu'il existe déjà une méthode avec le même nom dans la classe de base.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 152
    Points : 61
    Points
    61
    Par défaut
    ok, et donc du moment où l'on est conscient de ce que l'on fait, on rajoute la directive reintroduce.
    Merci

  10. #10
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Je ne suis pas d'accord ou j'ai mal compris ce qui a été dit), j'ai un constructeur (pour une form) de ce type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        constructor Create(AOwner : TComponent; pParent : TWinControl; pUtilisateur : TUtilisateur); reintroduce;
    Et je ne ne peux pas appelre le constructeur "de base" Create(AOwner:TComponent).

    J'utilise Delphi 7
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  11. #11
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 859
    Points : 11 307
    Points
    11 307
    Billets dans le blog
    6
    Par défaut
    pour moi, le reintroduce sert à masquer (empêcher l'accès à) une méthode ancestrale dans un descendant pris comme tel ; ce qui n'empêche pas l'accès quand il est pris comme ancêtre (cf exemple de Franck SORIANO)

    il élimine aussi le warning, qui nous prévenait de l'homonymie, puisqu'on signale que c'était volontaire

    et la directive existe déjà en D5 (avant ?)
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  12. #12
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 469
    Points : 24 905
    Points
    24 905
    Par défaut
    Citation Envoyé par Franck SORIANO Voir le message
    Non ce n'est pas possible ! Une fois qu'un membre a été déclaré publique dans un objet, il n'est pas possible d'en interdire l'accès dans les classes dérivées. C'est la même chose pour un constructeur virtuelle.
    C'est bien mon problème pour comprendre, parfois ça cache, reintroduce SANS overload, ... et parfois cela ne cache pas, en fait, je n'ai pas tout compris comme je le disais, ... alors je surcharge aussi le constructeur sans paramètre, j'y glisse le déclenchement d'une exception genre ENotAllowedConstructor ...

    Et donc bien vu, si je fait le code suivant, j'ai une erreur de compilation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Instance := TMaClasseDerive.Create(Owner)
    Et bien, vu mon problème était de masqué le Create lorsque l'on passe via une Référence de Classe ... bien vu, ... mais bon cela reste pas primordiale, il suffit de documenter ses objets en espérant que les docs seront lu ...

    Citation Envoyé par Cl@udius Voir le message
    A part masquer le warning à la compilation:

    je n'y vois personnellement aucune autre utilité.

    @+
    lol, je n'ai pas osé le dire, mais ... c'est ce que je pensais aussi ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  13. #13
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Je viens de relire et jai compris. Merci.
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

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

Discussions similaires

  1. Surcharger un constructeur de classe
    Par pdgnr dans le forum C++Builder
    Réponses: 5
    Dernier message: 09/11/2006, 10h17
  2. [POO] Surcharge de constructeur
    Par loganblack dans le forum Langage
    Réponses: 4
    Dernier message: 17/05/2006, 12h26
  3. Réponses: 19
    Dernier message: 19/04/2006, 10h16
  4. [POO] surcharger le constructeur
    Par wdionysos dans le forum Langage
    Réponses: 9
    Dernier message: 22/03/2006, 15h42
  5. Surcharge de constructeur???
    Par Sunsawe dans le forum Général Python
    Réponses: 3
    Dernier message: 14/03/2006, 17h26

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