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 :

Méthode commune à plusieurs classes


Sujet :

Langage Delphi

  1. #1
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut Méthode commune à plusieurs classes
    Salut tout le monde,

    J'ai plusieurs class avec des hértiages différents qui n'ont aucun parent en commun et je voudrais pourtant qu'elles disposent toutes de la meme méthode.


    Comment dois je faire ?

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 747
    Points : 13 314
    Points
    13 314
    Par défaut
    En POO traditionnelle, c'est malheureusement impossible.

    Il faudrait retrouver la méthode par RTTI ou éventuellement utiliser une Interface. (D'autres que moi seront plus à même de te donner plus d'indications. So stay tune. )

  3. #3
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    Merci quand meme Andnotor

  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 448
    Points
    28 448
    Par défaut
    Citation Envoyé par rvzip64 Voir le message
    Salut tout le monde,

    J'ai plusieurs class avec des hértiages différents qui n'ont aucun parent en commun et je voudrais pourtant qu'elles disposent toutes de la meme méthode.


    Comment dois je faire ?
    tout dépend de ce que tu entends pas là...

    j'aurais tendance à répondre qu'en effet il n'est pas possible de définir une méthode commune à toutes ces classes...mais il reste possible de définir des choses communes...comme une interface par exemple.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    Tu as un exemple simple d'utilisation d'interface ?

  6. #6
    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 448
    Points
    28 448
    Par défaut
    oui

    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
     
    type
     IMonInterface=interface
      procedure MaMethode;
     end;
     
     TMonButton=class(TButton, IMonInterface)
      procedure MaMethode;
     end;
     
     TMaClasse=class(TMonAncetre, IMonInterface)
      procedure MaMethode;
     end;
     
    procedure FaireQuelqueChose(AMonInterface : IMonInterface);
    begin
      AMonInterface.MaMethode;
    end;
     
    var
     MonButton : TMonButton;
     MaClasse : TMaClasse;
    begin
      MonButton := TMonButton.Create(nil);
      MaClasse := TMaClasse.Create;
      FaireQuelqueChose(MonBouton);
      FaireQuelqueChose(MaClasse);
    end;
    attention cependant si l'objet ne supporte aucune interface IUknown sera réclamée en plus de IMonInterface

    et si tu ne veux pouvoir travailler sur une classe sans la dériver, tu peux toujours créer une classe supplémentaire :

    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
     
    type
     TButtonInterface=class(TInterfacedObject, IMonInterface)
     private
      FButton : TButton;
      procedure MaMethode;
     public
      constructor Create(AButton : TButton);
     end;
     
    var
     ButtonInterface : TButtonInterface;
    begin
     ButtonInterface := TButtonInterface(Button1);
     FaireQuelquechose(ButtonInterface);
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    En gros ça veut dire que l'interface définit un ensemble de méthode, mais est ce que je peux faire ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    type
     IMonInterface=interface
      procedure MaMethode;
     end;
     
     
    procedure IMonInterface.mamethode;
    begin
       showmessage('salut');
    end;

  8. #8
    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 448
    Points
    28 448
    Par défaut
    non !

    l'interface (comme pour une unité) ne produit aucun code, c'est jusque la déclaration des méthodes.

    pour mettre du code, il faut un objet qui implémente l'interface (comme la partie implémentation d'une unité).
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    ok donc dans tous les cas je vais etre obligé de dupliquer le code de ma fonction dans chacun de mes objets.

  10. #10
    Aos
    Aos est déconnecté
    Membre habitué

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 189
    Points : 187
    Points
    187
    Par défaut
    A moins que tu fasses une classe abstraite parent a toute tes classes avec uniquement ta procedure.

  11. #11
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    C'est pas possible j'hérite de différentes classes présentent dans delphi

  12. #12
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    Salut,

    Salut tout le monde,

    J'ai plusieurs class avec des hértiages différents qui n'ont aucun parent en commun et je voudrais pourtant qu'elles disposent toutes de la meme méthode.


    Comment dois je faire ?
    A mon avis ça depend du traitement que la méthode effectue.
    1) si elle manipule des données de l'instance de la classe alors l'utilisation des interfaces s'impose
    2) dans le cas contraire, il suffit de creer une classe utilitaire, ou peut être un class helper (ne maitrisant pas ce dernier)
    Akim Merabet

  13. #13
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par rvzip64 Voir le message
    ok donc dans tous les cas je vais etre obligé de dupliquer le code de ma fonction dans chacun de mes objets.
    Pas forcément je dirais. Cela dépend en fait surtout de ce que fais cette méthode commune.

    Si tu peux résumer cette méthode à une routine simple alors dans toutes les implémentations de l'interface dans tes divers objets tu te contente de faire appel à la routine.

    Ton code est ainsi centralisé dans ta routine, c'est juste qu'il y a autant d'appels que de classe qui implémente ta méthode commune en fait.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 747
    Points : 13 314
    Points
    13 314
    Par défaut
    Il s'agit plus d'un question à Paul qu'une réponse supplémentaire (j'apprends en même temps ), mais ça pourrait faire avancer le Schmilblick.

    Est-ce que l'interface accepte un record (Ou plus généralement une variable) ?
    Les records acceptant des procédures/fonctions depuis D2007 (je crois), est-ce que quelque chose comme cela est envisageable ?

    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
    type
      TMonRecord = record
        procedure MaMethode;
      end;
     
      IMonInterface=interface
        MonRecord :TMonRecord;
      end;
     
      TMaClasse=class(TMonAncetre, IMonInterface)
        ...
      end;
     
      procedure TMonRecord.maMethode;
      begin
        showmessage('salut');
      end;
     
      procedure FaireQuelqueChose(AMonInterface : IMonInterface);
      begin
        AMonInterface.MonRecord.MaMethode;
      end;

  15. #15
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Non car tu ne peux pas définir de champs dans une interface, tu peux (dans les versions récentes de Delphi) définir des propriétés à implémenter mais pas des champs.

    Une interface ça n'est qu'un squelette (on parle aussi de contrat) pour les classes qui implémenterons cette interface.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  16. #16
    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 448
    Points
    28 448
    Par défaut
    Citation Envoyé par rvzip64 Voir le message
    ok donc dans tous les cas je vais etre obligé de dupliquer le code de ma fonction dans chacun de mes objets.
    de façon général ... oui

    prenons un exemple; voici deux objets qui possèdent une propriété Text de type string. Admettons que je veuille pouvoir passer se texte en majuscule...je pourrais définir un méthode ToUppercase() qui se charge de le faire, et désirer pour l'invoquer dans une boucle

    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
     
    type
      TMonObjet1=object
        num1 : Integer;
        num2 : Integer;
        Text  : string;
      end;
     
      TMonObjet2=object
        data1 : String;
        Text  : string;
      end;
     
    var
      list : TList;
      i : Integer;
    begin
      list := TList.Create;
      list.Add(TMonObjet1.Create);
      list.Add(TMonObjet2.Create);
      for i := 0 to Pred(list.count)
       T???(List[i]).ToUpper();
    end;
    voila le problème, j'ai des objets différents dans une liste, je veux effectuer un même traitement...comment faire ?

    [NB: il y a peut-être une solution avec les ClassHelper, mais je n'ai jamais exploré cela puisque je me suis arrêté à Delphi 7 ]

    Le premier constat est qu'il est "impossible" d'avoir un même code qui fera le traitement pour les deux classes.

    Voici une première façon de traiter le 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
    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
     
    type
     TUpperObject = class
      procedure ToUpper(); virtual; abstract;
     end;
     
     TMonObjet1Upper = class (TUpperObject)
     private
      FObject : TObject1;
     public
      constructor Create(AObject : TObject1);
      procedure ToUpper(); override;
     end;
     
    constructor TMonObjet1Upper.Create(AObject: TObject1);
    begin
      FObject := AObject;
    end;
     
    procedure TMonObject1Upper.ToUpper();
    begin
      FObject.Text := UpperCase(FObject.Text);
    end;
     
    type
     TMonObjet2Upper = class (TUpperObject)
     private
      FObject : TObject2;
     public
      constructor Create(AObject : TObject2);
      procedure ToUpper(); override;
     end;
     
    constructor TMonObjet2Upper.Create(AObject: TObject2);
    begin
      FObject := AObject;
    end;
     
    procedure TMonObject2Upper.ToUpper();
    begin
      FObject.Text := UpperCase(FObject.Text);
    end;
     
    var
      list : TList;
      i : Integer;
    begin
      list := TList.Create;
      list.Add(TMonObject1Upper.Create(TMonObjet1.Create));
      list.Add(TMonObject2Upper.Create(TMonObjet2.Create));
      for i := 0 to Pred(list.count)
       TUpperObject(List[i]).ToUpper();
    end;
    [NB: les classes génériques trouvent ici un usage tout indiqué...bien que ma version de Delphi... ]

    Et une autre approche :

    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
     
    type
     IUpperInterface = interface
      procedure ToUpper(); 
     end;
     
     TMonObjet1Upper = class (TMonObjet1, IUpperInterface)
      procedure ToUpper(); 
     end;
     
    procedure TMonObject1Upper.ToUpper();
    begin
      Text := UpperCase(Text);
    end;
     
    type
     TMonObjet2Upper = class (TMonObjet2, IUpperInterface)
      procedure ToUpper(); 
     end;
     
    procedure TMonObject2Upper.ToUpper();
    begin
      Text := UpperCase(Text);
    end;
     
    var
      list : TList;
      i : Integer;
    begin
      list := TList.Create;
      list.Add(TMonObjet1Upper.Create);
      list.Add(TMonObjet2Upper.Create);
      for i := 0 to Pred(list.count)
       IUpperInterface(List[i]).ToUpper();
    end;
    dans le premier cas, on a une classe qui chapeaute le tout et qui peut très bien avoir des variables internes et même avoir un ancêtre commun...de l'autre on demande à la classe de posséder l'ensemble des méthodes de l'interface afin de pouvoir les invoquer dans un regroupement homogène
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. Réponses: 4
    Dernier message: 29/02/2012, 15h42
  2. Méthode avec composants sur plusieurs classes
    Par isa911Bis dans le forum Débuter avec Java
    Réponses: 8
    Dernier message: 08/09/2011, 16h36
  3. Réponses: 5
    Dernier message: 07/06/2007, 17h47
  4. [C# 2.0 / VS 2005] Classes communes à plusieurs projets
    Par oodini dans le forum Visual Studio
    Réponses: 10
    Dernier message: 19/07/2006, 14h47
  5. [MFC] objet commun a plusieurs classes
    Par Info42 dans le forum MFC
    Réponses: 4
    Dernier message: 11/05/2006, 18h52

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