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 :

Choisir l'ancêtre selon la fonction


Sujet :

Langage Delphi

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut Choisir l'ancêtre selon la fonction
    Bonjour à tous

    Dans la lignée de la dernière discussion, quels sont les directives à ajouter aux descendants de troisième générations afin de choisir l'ancêtre de première ou de seconde génération.

    Merci d'avance

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;
     
    type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
     
    Grand_Pere=class
    public
        function Maj:integer;virtual;
    end;
    Pere=class(Grand_Pere)
    public
        function Maj:integer;override;
    end;
    Fille=class(Pere)
    public
        function Maj:integer;override;
    end;
    Fils=class(Pere)
    public
        function Maj:integer;override;
    end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
     
    function Grand_Pere.Maj:integer;
    begin
         result:=1;
    end;
    function Pere.Maj:integer;
    begin
        result:=inherited Maj +1;
    end;
    function Fils.Maj:integer;
    begin
        result:=inherited Maj +1;//hérite du père : result:=3;
    end;
    function Fille.Maj:integer;
    begin
        result:=inherited {???}Maj -1;//afin d'hériter de Grand_Pere seulement pour cette fonction et que le résultat soit 0
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    var G:Grand_Pere;P:Pere;F:Fille;M:fils;
    begin
       G:=Grand_Pere.create;
       P:=Pere.create;
       F:=Fille.create;
       M:=Fils.create;
     
    form1.caption:= inttostr(G.Maj)+' '+inttostr(p.Maj)+' '+inttostr(M.Maj)+' '+inttostr(F.Maj);
    end;
     
    end.

  2. #2
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 509
    Points : 2 780
    Points
    2 780
    Billets dans le blog
    10
    Par défaut Cours suite
    Utiliser le transtypage :
    Avec ma fille que je considère comme mon grand-père
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    with F as GrandPere do MAJ
    Pour information et par convention lorsque l'on décrit une classe on préfixe par T plutôt TGrandPere que grandPere pour éviter de confondre la classe et son instance

    Mais je ne veux pas rentrer dans les histoires de famille

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 831
    Points : 13 579
    Points
    13 579
    Par défaut
    Le transtypage doit alors être externe à la classe sous peine de réentrance, à moins de supprimer l'override et casser le comportement polymorphique.

    Ceci ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    type
      Fille=class(Pere)
      public
        function Maj:integer;override;
      end;
     
    function Fille.Maj:integer;
    begin
        result := Grand_Pere(Self).Maj -1;
    end;
    Le teste devrait être fait au niveau du père pour ignorer la fille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function Pere.Maj:integer;
    begin
      result := inherited;
     
      if not InheritsFrom(Fille) then
        inc(result);
    end;

  4. #4
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 509
    Points : 2 780
    Points
    2 780
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Le transtypage doit alors être externe à la classe sous peine de réentrance, à moins de supprimer l'override et casser le comportement polymorphique.
    ]
    Je confirme
    Autre possibilité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ...
    function Fille.Maj: integer;
    var
      v1 : Grand_Pere ;
    begin
      v1 := Grand_Pere.Create  ;
      result := v1.Maj ;
      v1.free ;
    end;
    ...
    C'est une figure de style mais en Delphi cela n'a pas grand intérêt.
    Notre interlocuteur essaie d'appliquer certainement le polymorphisme selon le paradigme de la POO qui n'est pas le paradigme initial de Object Pascal.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    Merci à tous

    Citation Envoyé par ALWEBER Voir le message
    Utiliser le transtypage :
    Pour information et par convention lorsque l'on décrit une classe on préfixe par T plutôt TGrandPere que grandPere pour éviter de confondre la classe et son instance

    Mais je ne veux pas rentrer dans les histoires de famille
    Tout-à-fait. J'utilise pour un objet "O_", pour les types non-objet j'utilise "t" sauf quand ce sont des type tableau j'utilise "a"

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    Merci

    Citation Envoyé par Andnotor Voir le message
    Le transtypage doit alors être externe à la classe sous peine de réentrance, à moins de supprimer l'override et casser le comportement polymorphique.

    Le teste devrait être fait au niveau du père pour ignorer la fille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function Pere.Maj:integer;
    begin
      result := inherited;
     
      if not InheritsFrom(Fille) then
        inc(result);
    end;
    Dans la question, je demandais que la fille hérite directement du grand père pour des raisons de simplicité. Mais pour mes besoins, je veux surtout que "Fille" hérite de "Fils" parce que dans 95% des fonctions de "Fils" sont partagées par "Fille" mais les quelques différences doivent être réécrite à partir de "Pere"

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 710
    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 710
    Points : 25 593
    Points
    25 593
    Par défaut
    Pourquoi ne pas faire un autre objet de délégation
    L'héritage n'est pas forcément la solution, la composition peut-être un meilleur compromis
    Voir aussi la pattern Strategy qui sera intéressante à mettre en place au lieu d'un héritage qui semble être bricolé

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Pourquoi ne pas faire un autre objet de délégation
    L'héritage n'est pas forcément la solution, la composition peut-être un meilleur compromis
    Voir aussi la pattern Strategy qui sera intéressante à mettre en place au lieu d'un héritage qui semble être bricolé
    Faire une class Enfant d'où dérivera Fils et Fille. et bien oui c'est plus propre.

    Strategy connait pas, je jette un coup d'oeil.

    Merci

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 831
    Points : 13 579
    Points
    13 579
    Par défaut
    Citation Envoyé par ALWEBER Voir le message
    Autre possibilité :
    Ce qui impliquera encore un Assign/AssignTo, ça devient un peu lourd

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

Discussions similaires

  1. Principes d'héritages sur plusieurs assembly
    Par geektoo dans le forum VB.NET
    Réponses: 3
    Dernier message: 26/10/2014, 15h14
  2. Héritage sur plusieurs niveaux
    Par L0rD59 dans le forum Doctrine2
    Réponses: 1
    Dernier message: 14/05/2013, 09h30
  3. Héritage sur plusieurs niveaux de user control
    Par lila23 dans le forum Silverlight
    Réponses: 6
    Dernier message: 14/09/2011, 16h18
  4. [Conception] Héritage sur Plusieurs classes abstraites
    Par facilus68 dans le forum Langage
    Réponses: 9
    Dernier message: 20/03/2009, 14h06
  5. [Hibernate] Héritage sur plusieurs niveaux
    Par srvremi dans le forum Hibernate
    Réponses: 2
    Dernier message: 31/05/2006, 19h39

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