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 :

Class Property & static getter ?


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club Avatar de Didier LOZAC'H
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2012
    Messages : 6
    Par défaut Class Property & static getter ?
    Bonjour,

    Est-ce que quelqu'un sait expliquer pourquoi les accesseurs des propriétés de classe doivent être statiques ?

    Cette contrainte est étrange puisque une propriété de classe est liée à la classe. Il serait logique que les accesseurs disposent d'une référence à la classe par l'argument Self comme c'est le cas des méthodes de classe non statiques.De plus, cette limite est contournable par l'emploi de fonctions de classe qui fonctionnent comme des pseudo propriétés

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    TType1 = class
    private
      class function GetProp1: string; static; // Ne peut pas être virtuelle et surchargée
    public
      class property Prop1 : string read GetProp1;
      // Pseudo class property prop2
      class function Prop2 : string; virtual;  // Est virtuelle et peut être surchargée
    end;
    Cette technique est utilisée par Borland/CodeGear/Embarcadero pour définit la propriété ClassName

    Merci par avance,

    DLZ

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    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 972
    Par défaut
    Citation Envoyé par Didier LOZAC'H Voir le message
    Bonjour,

    Est-ce que quelqu'un sait expliquer pourquoi les accesseurs des propriétés de classe doivent être statiques ?

    Cette contrainte est étrange puisque une propriété de classe est liée à la classe. Il serait logique que les accesseurs disposent d'une référence à la classe par l'argument Self comme c'est le cas des méthodes de classe non statiques.De plus, cette limite est contournable par l'emploi de fonctions de classe qui fonctionnent comme des pseudo propriétés
    TType1 = class
    private
    class function GetProp1: string; static; // Ne peut pas être virtuelle et surchargée
    public
    class property Prop1 : string read GetProp1;
    // Pseudo class property prop2
    class function Prop2 : string; virtual; // Est virtuelle et peut être surchargée
    end;

    Cette technique est utilisée par Borland/CodeGear/Embarcadero pour définit la propriété ClassName

    Merci par avance,

    DLZ
    Les accesseurs des propriétés de classe ne doivent pas nécessairement être statiques.
    Dans cette exemple tiré de la documentation officielle, il n'y a pas d'accesseur statique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
       THeading = 0..359;
       TCompass = class(TControl)
         private
            FHeading: THeading;
            procedure SetHeading(Value: THeading);
         published
            property Heading: THeading read FHeading write SetHeading;
            ...
        end;
    En plus tu sembles confondre les méthodes statiques (les "class function" que tu appelles "fonctions de classe") et le mot clé "static" qui sert, entre autre, a empêcher la surcharge de la méthode.

    Un peu de doc pour mieux comprendre.
    https://docwiki.embarcadero.com/RADS...Static_Methods

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    non Popo, la question est bien sur une propriété de classe qui réclame un membre de classe ou une méthode de classe statique (E2355)

    et je n'ai pas la réponse ... et j'ai tenté une astuce qui ne fonctionne 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    type
      TTest1 = class
      public
        class function GetProp1: string; static;
        class function GetProp2: string; virtual;
        class property Prop1: string read GetProp1;
      end;
     
      TTest2 = class(TTest1)
        class function GetProp2: string; override;
      end;
     
      TTestClass = class of TTest1;
     
    class function TTest1.GetProp1: string;
    begin
      Result := GetProp2;
    end;
     
    class function TTest1.GetProp2: string;
    begin
      Result := 'Test1';
    end;
     
    class function TTest2.GetProp2: string;
    begin
      Result := 'Test2';
    end;
     
    procedure Test(T: TTestClass);
    begin
      ShowMessage(T.ClassName + ' => ' + T.Prop1 + '/' + T.GetProp2);
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      test(TTest1);
      test(TTest2);
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Membre du Club Avatar de Didier LOZAC'H
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2012
    Messages : 6
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    non Popo, la question est bien sur une propriété de classe qui réclame un membre de classe ou une méthode de classe statique (E2355)

    et je n'ai pas la réponse ... et j'ai tenté une astuce qui ne fonctionne 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    type
      TTest1 = class
      public
        class function GetProp1: string; static;
        class function GetProp2: string; virtual;
        class property Prop1: string read GetProp1;
      end;
     
      TTest2 = class(TTest1)
        class function GetProp2: string; override;
      end;
     
      TTestClass = class of TTest1;
     
    class function TTest1.GetProp1: string;
    begin
      Result := GetProp2;
    end;
     
    class function TTest1.GetProp2: string;
    begin
      Result := 'Test1';
    end;
     
    class function TTest2.GetProp2: string;
    begin
      Result := 'Test2';
    end;
     
    procedure Test(T: TTestClass);
    begin
      ShowMessage(T.ClassName + ' => ' + T.Prop1 + '/' + T.GetProp2);
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      test(TTest1);
      test(TTest2);
    end;
    Bonjour,

    Merci Paul.
    J'avais également tenté sans succès cette astuce. C'est pourquoi j'utilise une fonction de classe comme pseudo propriété d'autant plus que cette technique est employée dans la classe de base TObject.

  5. #5
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    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 972
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    non Popo, la question est bien sur une propriété de classe qui réclame un membre de classe ou une méthode de classe statique (E2355)
    Effectivement, j'ai lu un peu vite.
    Lorsque j'ai lu "propriété de classe", je n'ai pas du tout songé qu'une propriété puisse être statique et j'ai pensé que c'était un problème de vocabulaire pour désigner une simple propriété.
    Toutes mes excuses pour la fausse information.

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    C'est une excellente question !

    En D7, les class property n'existaient donc par extension les accesseurs de class property.
    Peut-être une limitation de la VMT pour lier une class property avec des accesseurs virtuels dans la VMT qui serait une indirection plus complexe que des méthodes statiques qui sont directement à une adresse Class+X
    Déjà, la gestion des class var est retord, on avait eu un sujet dessus sur la portée et la confusion que l'on peut avoir

    J'ai aussi toujours trouvé cela étrange comme limitation mais en rien bloquant, on peut alors avec une Instance via un Singleton ou si l'on veut redéfinir un Multiton avec une Strategy pour produire les instances de chaque classe qui pourrait avoir besoin d'une property globale qui à l'utilisation ressemblera à une class property.
    Cela peut obliger à créer plus de classe, scinder la partie globale que tu aurais voulu en class property de la partie instance si tu as à la fois des champs de classes et des champs d'instance.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre du Club Avatar de Didier LOZAC'H
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2012
    Messages : 6
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    C'est une excellente question !

    En D7, les class property n'existaient donc par extension les accesseurs de class property.
    Peut-être une limitation de la VMT pour lier une class property avec des accesseurs virtuels dans la VMT qui serait une indirection plus complexe que des méthodes statiques qui sont directement à une adresse Class+X
    Déjà, la gestion des class var est retord, on avait eu un sujet dessus sur la portée et la confusion que l'on peut avoir

    J'ai aussi toujours trouvé cela étrange comme limitation mais en rien bloquant, on peut alors avec une Instance via un Singleton ou si l'on veut redéfinir un Multiton avec une Strategy pour produire les instances de chaque classe qui pourrait avoir besoin d'une property globale qui à l'utilisation ressemblera à une class property.
    Cela peut obliger à créer plus de classe, scinder la partie globale que tu aurais voulu en class property de la partie instance si tu as à la fois des champs de classes et des champs d'instance.
    Bonjour,

    Merci ShaiLeTroll.
    Je suppose également que cela est dû à une complexité excessive mais cette complexité est résolue pour les méthode de classe (class function ou class procedure) virtuelle. J'apprécie de comprendre le fonctionnement du compilateur / langage.


    Remarque : La librairie Bson/Json de Grijjy est passionnante pour comprendre le fonctionnement des interfaces et leur utilisation avec les record.

Discussions similaires

  1. [CLass]Property Abstract Possible ?
    Par Bleys dans le forum Delphi
    Réponses: 6
    Dernier message: 22/03/2007, 23h25
  2. [CLASSES] Attributs non-static apparemment considérés comme static ?
    Par Lideln dans le forum ActionScript 1 & ActionScript 2
    Réponses: 6
    Dernier message: 02/07/2006, 20h36
  3. Classe interne, methode static et ajout de boutons
    Par comme de bien entendu dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 09/03/2006, 14h13
  4. [Débutante][LDAP] utilisation de la classe Properties
    Par sangei dans le forum API standards et tierces
    Réponses: 31
    Dernier message: 07/12/2005, 08h50

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