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 :

Appel de methode d'une classe sans création d'objet


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut Appel de methode d'une classe sans création d'objet
    Salut à tous.

    J'ai une classe disons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Type
        TMyClass = Class(MyBaseClasse)
        private
        ......
        public
            procedure  DoSemething;
        end;
    Est ce qu'il y a un moyen d'appeler DoSomething sans pour autant instancier un objet de type TMyClass quite à faire des modification de code.
    Actuellement je dois creer un objet de type TMyClass avant d'appeler sa methode DoSomething.

    Merci de votre patience.

    Andry

  2. #2
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    Il suffit d'ajouter la directive class avant la déclaration de ta méthode.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Type
        TMyClass = Class(MyBaseClasse)
        private
        ......
        public
            class procedure  DoSemething;
        end;
    Mais ATTENTION, plus la peine de tenter d'accéder a la variable Self dans le but d'atteindre l'instance de la classe cela n'a pas de sens, en revanche on accède à la classe elle-meme comme le souligne e-ric.[corrigé]

  3. #3
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Salut,

    Je me doutais bien qu'il fallait faire comme ça : transformer la methode en methode de classe. Mais si je modifie, est ce que je peux encore appeler DoSomething via une instance de la classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    begin
        With  TMyClass.Create do
        try
            MaClasse.DoSomething;   //Est ce que je peux tjs faire ça
        finally
           free;
        end;
    end;
    Merci

  4. #4
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    Aucun pb pour appeler une méthode de classe depuis une instance !
    tu peux meme faire des méthodes de classes virtuel que tu peux overrider dans des descendants...

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

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 951
    Points
    3 951
    Par défaut
    Citation Envoyé par neilbgr
    Il suffit d'ajouter la directive class avant la déclaration de ta méthode.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Type
        TMyClass = Class(MyBaseClasse)
        private
        ......
        public
            class procedure  DoSemething;
        end;
    Mais ATTENTION, plus la peine de tenter d'accéder a la variable Self car ceci n'a pas de sens.
    Comment cela n'a pas de sens ?
    Dans une méthode de classe, self désigne la classe elle-même et non pas une instance. Donc Self a bien du sens.

    cdlt

    e-ric

  6. #6
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    Effectivement, je viens de corriger mon post.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Bonjour

    personellment j'utiliserais quelque chose du type

    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
     
    Unit1
     
    Type
    Type
        TMyClass = Class(MyBaseClasse)
        private
        ......
        public
            class procedure  DoSemething;
        end;
    implementation
     
    procedure TMyClass.DoSomething;
    begin
      Unit2.DoSomething;
    end;
    Et je mettrait DOSomething dans unit2

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

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 951
    Points
    3 951
    Par défaut
    Quel intérêt alors de passer par une méthode de classe ?

    cdlt

    e-ric

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Je ne sais pas. C'est peut être pour cela que je ne passerait pas par une méthode de classe. neilbgr pourrait sans dout me l'expliquer. J'avoue ne pas bien connaitre ce genre de chose.

  10. #10
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    Citation Envoyé par Tardiff Jean-François
    personellment j'utiliserais quelque chose du type
    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
     
    Unit1
     
    Type
        TMyClass = Class(MyBaseClasse)
        private
        ......
        public
            class procedure  DoSemething;
        end;
    implementation
     
    procedure TMyClass.DoSomething;
    begin
      Unit2.DoSomething;
    end;
    Et je mettrait DOSomething dans unit2
    Personnellement je n'opterais pas pour ce genre de solution (d'ailleur je ne l'ai pas suggérée).
    Car effectivement, dans ce cas là, autant déclarer la routine dans unit2 et l'utiliser directement sans passer par une méthode de classe.

    Aussi, ne connaissant pas le but d'Andry je ne peut pas deviner, d'où ma réponse aux éléments du problème donnés.

    En tout cas, si DoSomething n'as pas de lien quelconque avec la classe, je suis d'accord pour mettre cette méthode dans une unité a part en tant que routine (mais c'est ce que je viens d'ecrire 2 phrases avant).


    En revanche, rien n'empêche d'avoir le besoin d'obtenir une caractéristique ou une action propre propre a une classe et non a une instance de classe.

    Exemple :
    Atention: Ce qui suit n'est qu'un exemple, pas une explication généraliste !

    Prenons une modélisation de poutre en construction métalique :
    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
    type
     
    TPoutreDeBase = class(TComponent)
    public
      class function GetHauteur; virtual;
      class function GetLargeur; virtual;
      class function Profile: string; virtual;
    end;
     
    // Poutre de toiture
    TCharpente = class(TPoutreDeBase)
      class function GetHauteur; override;
      class function GetLargeur; override;
      class function Profile: string; override;
    end;
     
    // Poutre entre poteaux
    TPoutre = class(TPoutreDeBase)
     
    end;
     
    // Poutre entre poutres
    TSolive = class(TPoutreDeBase)
      class function GetHauteur; override;
      class function GetLargeur; override;
      class function Profile: string; override;
    end;
    avec comme impémentation :

    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
     
    class function TPoutreDeBase.Profile: string; 
    begin
      Result := 'Profile I';
    end;
     
    ...
     
    class function TSolive.GetHauteur; 
    begin
      Result := 0.40; // 40cm
    end;
     
    class function TSolive.GetLargeur; 
    begin
      Result := 0.20; // 20cm;
    end;
     
    class function TSolive.Profile: string; 
    begin
      Result := 'Profile T';
    end;
     
    end;
     
     ...
    Ceci permettrait par exemple d'obtenir les dimensions caractéristiques d'une solive sans avoir d'instance sous la main
    Ou bien, étant une instance de solive, il peut m'etre interessant d'obtenir ma hauteur afin de faire un calcul de décalage pour bien se positionner.

    Ainsi j'évite de déclarer des constante de partout, et ces informations sont "classées"

  11. #11
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    En faites, j'ai créé une classe pour gerer des traitement.
    Dans ces classes, certains methodes me permet de peupler des items de type TStrings par ex.
    Or des fois, j'ai juste besoin de peupler des combo et donc juste besoin de la methode sans pour autant avoir besoin de la classe, d'ou l'interet des methode de classes.

    Merci de vos réponse.

  12. #12
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1

Discussions similaires

  1. Instancier une classe sans nommer l'objet
    Par jamiria dans le forum VB.NET
    Réponses: 0
    Dernier message: 29/10/2010, 14h17
  2. [debutant] appelle de la methode d'une classe..
    Par pseudobidon57 dans le forum Langage
    Réponses: 2
    Dernier message: 21/06/2007, 18h02
  3. faire appel à une methode d'une classe bean
    Par senediene dans le forum Struts 1
    Réponses: 1
    Dernier message: 24/08/2006, 10h13
  4. Réponses: 5
    Dernier message: 20/11/2005, 11h15
  5. [C#][WebServices] Appel methode avec une classe en paramètre
    Par bran_noz dans le forum Windows Forms
    Réponses: 6
    Dernier message: 10/09/2004, 16h41

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