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

Lazarus Pascal Discussion :

Comment corriger : An inherited method is hidden by "destructor xyz;" ? [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Par défaut Comment corriger : An inherited method is hidden by "destructor xyz;" ?
    Bonjour,

    Savez-vous comment remédier à ce message :

    Warning: An inherited method is hidden by "destructor TAcars.Destroy;"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public
        destructor Destroy;
     
    [...]
     
    destructor TAcars.Destroy;
    begin
        inherited Destroy;
        acarsd_destroy(fLib);
    end;
    Merci,
    ZiP

  2. #2
    Membre éprouvé
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Par défaut
    J'ai ajouté ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    destructor Destroy; override;
    Je n'ai plus l'erreur, ma modification est-elle correcte ?

    Merci,
    ZiP

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 935
    Billets dans le blog
    6
    Par défaut
    Oui, puisque tu surcharges le destructeur de l'ancêtre (cad modifie son comportement) tout en laissant "visible" le TAncetre(TDescendant).Destroy
    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 !

  4. #4
    Membre éprouvé
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Par défaut
    Merci pour votre précision.

    ZiP

  5. #5
    Membre éprouvé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 58
    Par défaut
    C'est tout ce qu'il faut faire ? OMG j'en ai du code à revoir pour tous les faire sauter....

    merci pour la question et la réponse

  6. #6
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 142
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    Par défaut
    Bonjour,

    n'y aurait-il pas une autre erreur, là ? :
    Citation Envoyé par [ZiP] Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    destructor TAcars.Destroy;
    begin
        inherited Destroy;
        acarsd_destroy(fLib);
    end;
    Normalement,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      TTest.Destroy;
      begin
        ...
        Inherited;  // Toujours à la fin des destructeurs et démarre le destructeur (code seulement) de la classe parent
      end;
    Source

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 937
    Par défaut
    Citation Envoyé par Jipété Voir le message
    n'y aurait-il pas une autre erreur, là ?
    Avant ou après inherited dans Create ou Destroy n'est pas absolu. L'objet existe déjà à l'appel de Create et encore jusqu'à la sortie de la méthode Destroy.
    Create et Destroy ne servent qu'à allouer (et initialiser), respectivement libérer les variables propres à chaque classe de l'héritage (un peu réducteur, plein d'autres choses peuvent y être faites).

    Regarde TObject.Create, il est vide

    Les règles sont ainsi :
    • si tu dois accéder à la création aux variables ancêtres, c'est obligatoirement après inherited ;
    • si tu dois accéder à la destruction aux variables ancêtres, c'est obligatoirement avant inherited ;
    • sinon, c'est ton choix (même si par convention, on fera plutôt comme ci-dessus).


    J'ai eu un cas dernièrement sur la synchronisation d'un thread par event (mais il pourrait se présenter avec d'autres objets).

    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
    constructor TDelayThread.Create(...);
    begin
      inherited Create;
      StartEvent := TEvent.Create(...);
    end;
     
    destructor TDelayThread.Destroy;
    begin
      inherited;
      StartEvent.Free;
    end;
     
    procedure TDelayThread.TerminatedSet;
    begin
      inherited;
      StartEvent.SetEvent;
    end;
     
    procedure TDelayThread.Execute;
    begin
      while not Terminated do
      begin
        StartEvent.WaitFor(INFINITE);
      end;
    Le thread est en attente de l'event. Pour pouvoir le terminer, il faut commencer par le démarrer, donc activer/signaler l'event.
    La demande de fin du thread peut être faite par Terminate (qui appelle à son tour TerminatedSet) ou par Free.

    Dans le cas de Free, puisque TThread.Destroy appelle aussi Terminate. Si on détruit l'event avant inherited, c'est une VA dans TerminatedSet.
    Obligé ici de détruite l'event après inherited.

    Ton lien wiki n'est pas 100% pertinent

  8. #8
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 142
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Ton lien wiki n'est pas 100% pertinent
    Ben oui, mais alors, si même la Bible n'est pas fiable...
    Parce que c'est quand même le wiki de FreePascal, quoi,

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 937
    Par défaut
    C'est plus juste en allemand :
    Steht meistens am Ende ...
    Se situe généralement à la fin ...

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

Discussions similaires

  1. [C++ 1.1] Comment avoir accès aux méthodes d'une dll ?
    Par jacklsurf dans le forum Framework .NET
    Réponses: 6
    Dernier message: 15/04/2006, 22h49
  2. [MFC] Comment corriger ces fuites de mémoire
    Par Philippe320 dans le forum MFC
    Réponses: 8
    Dernier message: 07/03/2006, 13h50
  3. [FTP] comment corriger une boucle infinie ?
    Par sofybj dans le forum Langage
    Réponses: 8
    Dernier message: 08/11/2005, 14h49
  4. Comment corriger le bug de RightClickSelect du treeview de Delphi 7 ?
    Par bambino3996 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 01/08/2005, 13h47

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