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 :

Question sur héritage


Sujet :

Delphi

  1. #1
    Membre Expert

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

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 296
    Par défaut Question sur héritage
    J'ai un objet ObjPère et plusieurs classes filles qui en héritent.

    Dans l'objet ObjPère, dans son constructor je lui passe un paramètres pId.

    Ce paramètre pId me permet de récupérer une donnée, et en fonction de cette donnée, je voudrais choisir quelle classe fille je veux créer.


    Si je ne suis pas assez clair, dites-le moi.

  2. #2
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 568
    Par défaut
    Salut

    La solution que tu as choisie est discutable car elle sous-entend que la classe ancêtre connaisse ses descendants. Ce choix signifie aussi que si tu conçois plus tard une nouvelle classe fille (pour une évolution du programme par exemple), tu seras amené à revoir aussi la classe mère. En outre, du fait de l'héritage, chaque fille pourra elle-même instancier des objets de type classe fille, est-ce vraiment attendu ? Cela peut être un choix de conception, mais il doit être motivé.

    Il vaudrait mieux séparer la logique de création des classes filles de la hiérarchie de classe qui les regroupe. Dans une telle situation, je pense qu'il est préférable de concevoir une classe spécifique dont le rôle se résume à créer les objets de type classe fille en fonction de ton paramètre pId. C'est ce qu'on appelle une fabrique si j'ai bien compris. Ce qui n'empêche de conserver la hiérarchie que tu as conçu initialement.

    Cordialement

    e-ric

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  3. #3
    Membre Expert

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

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 296
    Par défaut
    Je n'aimais pas la solution vers laquelle je m'orientais, mais je ne voyais pas trop comment faire autrement.

    Je vais m'orienter vers le système fabrique.

    Merci.

  4. #4
    Membre émérite
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Par défaut
    Pour illustrer ce mécanisme :

    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
      // déclaration
     
      TPere = class
      protected
        id : integer;
      public
        procedure p; virtual; abstract;
        constructor Create(pID : integer);
      end;
     
      TPereClass = class of TPere;
     
      TFilleA = class(TPere)
      public
        procedure p; override;
      end;
     
      TFilleB = class(TPere)
      public
        procedure p; override;
      end;
     
      TPereFactory = class
      private
        classes : TStringList;
      public
        constructor Create;
        function fabriquer(pID : integer) : TPere;
        destructor Destroy; override;
      end;
     
      // implémentation
     
    { TPere }
     
    constructor TPere.Create(pID: integer);
    begin
      id := pID;
    end;
     
    { TFilleA }
     
    procedure TFilleA.p;
    begin
      inherited;
      showMessage('je suis A, id=' + intToStr(id));
    end;
     
    { TFilleB }
     
    procedure TFilleB.p;
    begin
      inherited;
      showMessage('je suis B, id=' + intToStr(id));
    end;
     
    { TPereFactory }
     
    constructor TPereFactory.Create;
    begin
      // classes sert à associer les id aux classes 
      classes := TStringList.Create;
      classes.AddObject('1',TObject(TFilleA));
      classes.AddObject('2',TObject(TFilleB));
    end;
     
    destructor TPereFactory.Destroy;
    begin
      classes.Free;
      inherited;
    end;
     
    function TPereFactory.fabriquer(pID: integer): TPere;
    var
     i : integer;
    begin
      i := classes.indexOf(intToStr(pID));
      if (i > -1) then
        result := TPereClass(classes.Objects[i]).Create(pID)
      else
        raise Exception.Create('TPereFactory : pID [' + intToStr(pID) + '] incorrect');
    end;
     
    // utilisation :
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      with TPereFactory.Create do
      try
        with fabriquer(2) do
        try
          p;
        finally
          Free;
        end;
      finally
        Free;
      end;
    end;
    Bloon

  5. #5
    Membre Expert

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

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 296
    Par défaut
    D'accord, je vois mieux le système.

    Merci

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

Discussions similaires

  1. Questions sur héritage
    Par Mornor dans le forum Général Java
    Réponses: 24
    Dernier message: 12/11/2013, 16h28
  2. 2 questions sur héritage et require() distant
    Par ctrl+z dans le forum Langage
    Réponses: 8
    Dernier message: 06/01/2009, 08h42
  3. Question sur Héritage
    Par Moustico dans le forum C++/CLI
    Réponses: 6
    Dernier message: 03/01/2008, 19h27
  4. [Héritage] Question sur le polymorphisme
    Par nikhil dans le forum C++
    Réponses: 7
    Dernier message: 28/12/2005, 20h33
  5. Réponses: 2
    Dernier message: 04/12/2005, 21h10

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