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 :

Héritage de liste


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement de composants
    Inscrit en
    Juin 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement de composants

    Informations forums :
    Inscription : Juin 2015
    Messages : 13
    Points : 10
    Points
    10
    Par défaut Héritage de liste
    Bonjour à tous,

    J'aimerais faire quelque chose en Delphi, mais je ne sais pas si c'est possible. Je vous remercie d'avance de m'indiquer si mon idée tient la route ou alors si conceptuellement cela n'est pas possible.

    Alors voila, j'ai une classe liste que je déclare comme cela :

    TMaListe = class(TObjectList<TMaClasse>)
    // Mes méthodes, propriétées, ...

    End;

    TMaClasse est une classe quelconque que j'ai créé selon mes besoins.

    Ce que j'aimerais faire maintenant, c'est déclarer une nouvelle classe liste qui serait une descendante de TMaListe et elle devrait contenir des descendants de TMaClasse.

    C'est cette sorte de double héritage qui me pose problème, je n'arrive pas à trouver la synthaxe ou alors c'est peut-être juste pas possible.

    Avez-vous des idées ?

    Merci

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Je me trompe peut-être car au niveau de Delphi j'en suis resté à la version 7.
    Mais ceci compile en C#
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class TMaListe : List<Costumer> { }
     
    public class TMaListeDescendante : TMaListe { }

    Donc à priori ceci devrait suffire :
    Code Delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TMaListeDescendante = class(TMaListe)
    private
    public
    end;

    Personnellement hériter d'un TObjectList<T> directement est quelque chose que je ne trouve pas très élégant.
    Je préfère faire de l'aggrégation ou de la composition.

    Mais je suis curieux de connaître le fonctionnel qui impose une telle mécanique.
    Peut-être pars-tu dans la mauvaise direction ?

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement de composants
    Inscrit en
    Juin 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement de composants

    Informations forums :
    Inscription : Juin 2015
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Merci pour la réponse, alors voilà quelques précisions.

    Après quelques modifications il semblerait que je n'ai pas besoin de faire une classe qui hérite de TMaListe. En effet, la manière dont sont traités les "TMaClasse" et classes filles sont les mêmes.

    Je fais dériver de TObjectList<T> pas confort d'utilisation, en effet tout le traitement des listes est déjà fait et je n'ai qu'à ajouter les actions que je veux. Typiquement certains tests pour autoriser un ajout, des actions supplémentaires suites à une suppression, ...

    Par contre, j'ai une classe de base et deux filles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TMaClasse = class
      public 
        maFonction; //Virtuelle;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TMaFille1 = class(TMaClasse)
      public 
        maFonction; //Redefinie1;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TMaFille2 = class(TMaClasse)
      public 
        maFonction; //Redefinie2;
    end;
    Si je reprends ce que tu as proposé et que je remplis une liste de type "TMaListeDescendante" de TMaFille1 ou TMaFille2, et que fait appelle à la fonction "maFonction" je passe uniquement par la fonction de la classe mère. Surement car dans la déclaration on dit <TMaClasse>. Donc comment faire une liste qui manipule des TMaClasse ou descendantes de manière générique mais qui fait appel à la fonction "maFonction" correspondant à la vraie classe. Genre si j'ai une liste remplie de TMafille2, et que j'appelle cette fonction je voudrais passer par "Redefinie2" ?

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    pour les templates, au départ le plus simple et d'imaginer cela comme un copier/coller (ce que ce n'est malheureusement pas)

    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
     
    type
      TList1 = class(TObjectList)
        function Add(Item: TItem1);
      end;
     
      TList2 = class(TObjectList)
        function Add(Item: TItem2);
      end;
     
    // devient
      TList<T> = class(TObjectList)
        function Add(Item: T);
      end;
     
      TList1 = TList<Titem1>
      TList2 = TList<Titem2>
    à toi de voir où tu veux mettre des fonctions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    type
      TExObjectList = class(TObjectList)
        procedure ProcedureSurTObject;
      end;
     
      TList<T> = class(TExObjectList)
        procedure ProcedureSurT; // par copier/coller
      end;
     
      TList1 = class(TList<TItem1>)
       procedure ProcedureSurItem1;
      end;
    tu peux avoir aussi au besoin ce montage

    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
     
    type
      TExObjectList = class(TObjectList)
        procedure ProcedureSurTObject;
      end;
     
      TItem = class
      end;
     
      TList<T:TItem> = class(TExObjectList)
        procedure ProcedureSurTItem; // par copier/coller
      end;
     
      TItem1 = class(TItem)
      end;
     
      TList1 = class(TList<TItem1>)
       procedure ProcedureSurItem1;
      end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement de composants
    Inscrit en
    Juin 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement de composants

    Informations forums :
    Inscription : Juin 2015
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Merci beaucoup, cela m'aide déjà pas mal.

    Si je comprends bien, TList<T:TItem> veut dire que les listes TList peuvent uniquement contenir des TItem ou descendants, c'est juste ?

    Dans une fonction par exemple TList<T>.MaFonction, comment faire pour affecter le self de TList à un objet déjà déclarer ?

    Exemple :

    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
     
    interface
     
    TMaListe<T: TItem> = class(TObjectList<T>)
      function MaFonction;
    end;
     
    Liste : TMaListe<TItem>;
     
    implementation
     
    function TMaListe<T>.MaFonction;
    begin
    Liste := Self;
    end;
    J'ai l'erreur E2010 Incompatibles type : TMaListe<TItem> and TMaListe<T>.T

    Je ai encore un peu de peine avec la généricité et delphi en général, j’implore votre clémence si mes questions ne tiennent pas la route


    EDIT Je suis en train de corriger qqch que j'avais mal appliqué. J'ai plus l'erreur de type incompatibles. Je mettrais des infos plus tard pour vous expliquer comment j'ai fait ou alors vous demander encore de l'aide ^^

  6. #6
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par LiffeurDeiench Voir le message
    Si je reprends ce que tu as proposé et que je remplis une liste de type "TMaListeDescendante" de TMaFille1 ou TMaFille2, et que fait appelle à la fonction "maFonction" je passe uniquement par la fonction de la classe mère. Surement car dans la déclaration on dit <TMaClasse>. Donc comment faire une liste qui manipule des TMaClasse ou descendantes de manière générique mais qui fait appel à la fonction "maFonction" correspondant à la vraie classe. Genre si j'ai une liste remplie de TMafille2, et que j'appelle cette fonction je voudrais passer par "Redefinie2" ?
    Ce n'est pas un probleme de generique mais d'override :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    TMaClasse = class
      public 
        maFonction; virtual;
    end;
     
    TMaFille1 = class(TMaClasse)
      public 
        maFonction; override;
    end;
     
    TMaFille2 = class(TMaClasse)
      public 
        maFonction; override;
    end;

  7. #7
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement de composants
    Inscrit en
    Juin 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement de composants

    Informations forums :
    Inscription : Juin 2015
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par LiffeurDeiench Voir le message

    ...

    EDIT Je suis en train de corriger qqch que j'avais mal appliqué. J'ai plus l'erreur de type incompatibles. Je mettrais des infos plus tard pour vous expliquer comment j'ai fait ou alors vous demander encore de l'aide ^^
    Mon problème lié au "Liste := Self;" est résolu, effectivement j'avais mal utilisé ces histoires d'héritages/généricité.

    Il me semble que j'arrive à faire ce que je voulais, tout ne fonctionne pas encore mais ça n'a pas de lien avec le sujet ici. Je vous montre quand même le principe si tout d'un coup qqn veut donner son avis ou si qqn rencontre le même problème.



    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
     
    interface
     
    TItem = class (UnParent)
    end;
     
    TMaFille = class(TItem)
    end;
     
    TMonFils = class (TItem)
    end;
     
    TMaListe<T: TItem, constructor> = class(TObjectList<T>)
      function MaFonction;
    end;
     
    TListeFille = class(TMaListe<TMaFille>)
    end;
     
    TListeFils = class(TMaListe<TMonFils>)
    end;
     
    FilleList :  TListeFille ;
    FilsList :  TListeFils ;
     
    implementation
    ...
    En n'oubliant pas les override comme a dit guillemouze

    Un très grand merci à Paul TOTH pour m'avoir guidé.

    J'arrive donc à manipuler différentes classes qui sont très proches les une des autres avec un minimum de code et c'est bien plus facile à maintenir et/ou modifier. Je ne mets pas encore le sujet comme résolu pour le moment car j'attends d'être sur de ne plus avoir de questions ^^

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

Discussions similaires

  1. Héritage et liste
    Par Flaburgan dans le forum C#
    Réponses: 12
    Dernier message: 06/04/2011, 13h22
  2. Héritage et List
    Par Benoit_T dans le forum Langage
    Réponses: 3
    Dernier message: 11/08/2010, 11h42
  3. Héritage et liste variable d'arguments
    Par jimaitou dans le forum Débuter
    Réponses: 9
    Dernier message: 08/03/2009, 19h52
  4. empecher héritage dans liste à puce imbriquées
    Par zamanika dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 15/03/2007, 15h18
  5. Héritage et listes chainées...
    Par syntaxerror dans le forum C++
    Réponses: 7
    Dernier message: 04/05/2005, 20h18

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