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 :

utilisation de class Function


Sujet :

Delphi

  1. #1
    Membre confirmé
    Avatar de Jcpan
    Inscrit en
    Août 2008
    Messages
    542
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 542
    Points : 475
    Points
    475
    Par défaut utilisation de class Function
    bonjour

    c'est quoi une "class Function"?
    en Quoi est ce utiles ?

    merci

  2. #2
    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
    Bonjour,

    "class function" est une écriture permettant de déclarer une méthode comme étant une "méthode de classe". Cela signifie que la méthode ne s'applique pas une instance de la classe mais à la classe elle-même.

    Ainsi pour appeler une méthode de classe on écrit : TMaClasse.MaMethode au lieu d'écrire généralement : AVar: TMaClasse; AVar.MaMethode.

    En outre à l'intérieur d'une méthode de classe, tu n'as pas accès aux membres ou aux méthodes qui ne sont pas de classe. L'intérêt est donc ici d'écrire des traitements qui ne nécessite pas d'utiliser les membres de la classe mais qui ont tout de même un rapport avec la sémantique de la classe.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  3. #3
    Membre confirmé
    Avatar de Jcpan
    Inscrit en
    Août 2008
    Messages
    542
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 542
    Points : 475
    Points
    475
    Par défaut
    Citation Envoyé par Aka Guymelef Voir le message
    Bonjour,

    "class function" est une écriture permettant de déclarer une méthode comme étant une "méthode de classe". Cela signifie que la méthode ne s'applique pas une instance de la classe mais à la classe elle-même.

    Ainsi pour appeler une méthode de classe on écrit : TMaClasse.MaMethode au lieu d'écrire généralement : AVar: TMaClasse; AVar.MaMethode.

    En outre à l'intérieur d'une méthode de classe, tu n'as pas accès aux membres ou aux méthodes qui ne sont pas de classe. L'intérêt est donc ici d'écrire des traitements qui ne nécessite pas d'utiliser les membres de la classe mais qui ont tout de même un rapport avec la sémantique de la classe.
    Je te serai reconnaissant si tu rajoute un exemple

  4. #4
    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
    Le concept des méthodes de classe peut s'approcher la plupart du temps du concept de routines (soit des procédures et fonctions simples).

    Un exemple trivial de la multiplication

    version objet

    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
    TMultiplication = class
    protected
      FOperande1: Integer;
      FOperande2: Integer;
    public
      function Multiplier: Integer;
     
      property Operande1: Integer read FOperande1 write FOperande1;
      property Operande2: Integer read FOperande2 write FOperande2;
    end;
     
    function TMultiplication.Multiplier: Integer;
    begin
      Result := FOperande1 * FOperande2;
    end;
     
    // Utilisation
    var
     v: TMultiplication;
    begin
      v := TMultiplication.Create;
      v.Operande1 := 2;
      v.Operande2 := 4;
      ShowMessage( IntToStr( v.Multiplier ) );
      v.Free;
    end;
    version méthode de classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    TMultiplication = class
    public
      class function Multiplier( const AOperande1, AOperande2: Integer ): Integer;
    end;
     
    classfunction TMultiplication.Multiplier( const AOperande1, AOperande2: Integer ): Integer;
    begin
      Result := AOperande1 * AOperande2;
    end;
     
    // Utilisation
    begin
      ShowMessage( IntToStr( TMultiplication.Multiplier( 2, 4 ) ) );
    end;
    Bon l'exemple est très trivial est ne montre pas vraiment une bonne utilisation des méthodes de classe mais dans l'esprit il faut conceptualiser cela comme étant des traitements qui ne s'appliquent pas à une instance particulière d'un objet mais de manière globale.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 685
    Points : 13 102
    Points
    13 102
    Par défaut
    J'ai utilisé cette technique lors de la création d'un designer.

    Les types d'objet utilisables (les classes) sont énumérés dans une liste et plutôt que de gérer une deuxième liste avec leur description, le texte en clair est récupéré directement par une méthode de classe.

    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
    type
      TBaseClass = class of TBase;
      TBase = class
        class function Description :string; virtual; abstract;
      end;
     
      TClass1 = class(TBase)
        class function Description :string; override;
      end;
     
      TClass2 = class(TBase)
        class function Description :string; override;
      end;
     
    var
      ClassList : array[0..1] of TBaseClass =
      (
        TClass1,
        TClass2
      );
     
    implementation
     
    {$R *.dfm}
     
    { TClass1 }
     
    class function TClass1.Description: string;
    begin
      Result := 'Description de la class1';
    end;
     
    { TClass2 }
     
    class function TClass2.Description: string;
    begin
      Result := 'Description de la class2';
    end;
     
    procedure TForm2.FormCreate(Sender: TObject);
    var
      i: Integer;
    begin
      for i := 0 to High(ClassList) do
        ListBox1.Items.Add(ClassList[i].Description);
    end;
     
    end.
    (Il y avait d'autres méthodes pour renvoyer une image, etc.)

  6. #6
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    J'ai utilisé cette technique lors de la création d'un designer.

    Les types d'objet utilisables (les classes) sont énumérés dans une liste et plutôt que de gérer une deuxième liste avec leur description, le texte en clair est récupéré directement par une méthode de classe.

    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
    type
      TBaseClass = class of TBase;
      TBase = class
        class function Description :string; virtual; abstract;
      end;
     
      TClass1 = class(TBase)
        class function Description :string; override;
      end;
     
      TClass2 = class(TBase)
        class function Description :string; override;
      end;
     
    var
      ClassList : array[0..1] of TBaseClass =
      (
        TClass1,
        TClass2
      );
     
    implementation
     
    {$R *.dfm}
     
    { TClass1 }
     
    class function TClass1.Description: string;
    begin
      Result := 'Description de la class1';
    end;
     
    { TClass2 }
     
    class function TClass2.Description: string;
    begin
      Result := 'Description de la class2';
    end;
     
    procedure TForm2.FormCreate(Sender: TObject);
    var
      i: Integer;
    begin
      for i := 0 to High(ClassList) do
        ListBox1.Items.Add(ClassList[i].Description);
    end;
     
    end.
    (Il y avait d'autres méthodes pour renvoyer une image, etc.)

    Tu devrais pas déclarer TBase avant TBaseClass ?

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 685
    Points : 13 102
    Points
    13 102
    Par défaut
    Pour une fois, l'ordre n'a pas d'importance . Il ne s'agit que d'un pointer sur la class. Au même titre, je peux écrire quelque chose comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PRec = ^TRec;
    TRec = record
      ...
    end;
    L'avantage de le définir avant est dans ce genre d'imbrication:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    type
      TBaseClass = class of TBase;
      TBase = class
        procedure CreateChild(aChildClass :TBaseClass);
        class function Description :string; virtual; abstract;
      end;

  8. #8
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Pour une fois, l'ordre n'a pas d'importance . Il ne s'agit que d'un pointer sur la class. Au même titre, je peux écrire quelque chose comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PRec = ^TRec;
    TRec = record
      ...
    end;
    L'avantage de le définir avant est dans ce genre d'imbrication:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    type
      TBaseClass = class of TBase;
      TBase = class
        procedure CreateChild(aChildClass :TBaseClass);
        class function Description :string; virtual; abstract;
      end;
    Qu'il est fort ce IfThenElse... heu oups ! ce AndNotOr

Discussions similaires

  1. [Taglibs] Utiliser les classes css ?
    Par PeteMitchell dans le forum Struts 1
    Réponses: 4
    Dernier message: 05/05/2007, 01h31
  2. [EJB][JONAS] EJB utilisant une classe "externe"
    Par Gregory3000 dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 13/12/2004, 19h57
  3. utilisation de CLASS dans un formulaire
    Par lepierre dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 18/11/2004, 16h38
  4. utiliser des classes dont on n'a pas le source
    Par kocin dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 28/08/2004, 16h05
  5. [Debutant] probleme pour utiliser les classes d'un .jar
    Par pissek dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 12/05/2004, 18h21

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