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 :

acces à une variable privé dans une classe


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de Jcpan
    Inscrit en
    Août 2008
    Messages
    542
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 542
    Par défaut acces à une variable privé dans une 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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Buttons;
     
    type
      TForm1 = class(TForm)
        SpeedButton1: TSpeedButton;
      procedure Explosion1;
        procedure SpeedButton1Click(Sender: TObject);
     
      private
        { Private declarations }
      public
        { Public declarations }
      end  ;
      Treg = class
      procedure Explosion1;  overload;
      procedure Explosion1 (Force: Integer); overload;
      procedure Explosion3 (Force, Vitesse: Integer);
      procedure Explosion4 (Force, Vitesse: Integer; Son: Boolean);
     
      private
      public
      protected
      id : integer ;
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
     
     
    procedure Treg.Explosion1();
    begin
     
    end;
     
    procedure Treg.Explosion1(Force: Integer);
    begin
     
    end;
     
    procedure Treg.Explosion3(Force, Vitesse: Integer);
    begin
     
    end;
     
    procedure Treg.Explosion4(Force, Vitesse: Integer; Son: Boolean);
    begin
     
    end;
     
     
    procedure TForm1.Explosion1();
    begin
    ShowMessage('helmi');
    end;
     
    procedure TForm1.SpeedButton1Click(Sender: TObject);
    var
    reg : Treg;
    begin
    reg := Treg.Create();
    reg.id := 555;
    ShowMessage(IntToStr(reg.id));
    reg.Free;
    end;
     
    end.
    je peux accéder et modifier la variable id depuis une autre classe alors qu'elle est déclaré protected dans la classe Treg.
    même chose si on met dans private

    est ce normale? je ne comprend pas.

  2. #2
    Membre Expert
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Par défaut
    Les classes Tform1 et TReg sont déclarées dans la même unité...
    Si tu veux que les règles d'encapsulation soient vérifiées, il faut déclarer TReg dans une autre unité.

    Fais le, tu verras qu'il n'est pas possible d'appeler reg.id...

  3. #3
    Membre Expert
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Par défaut
    et petite correction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      Treg = class
      private
        fId : integer;
      protected
        property Id : integer read fId write fId;
      public
        procedure Explosion1;  overload;
        procedure Explosion1(Force: Integer); overload;
        procedure Explosion3(Force, Vitesse: Integer);
        procedure Explosion4(Force, Vitesse: Integer; Son: Boolean);
      end;
    ce qui permet de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    type
      TReg2 = class(TReg)
      public 
        property Id; 
      end;
     
      TReg3 = class(TReg)
      published
        property Id;
      end;
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  4. #4
    Membre éclairé
    Avatar de Jcpan
    Inscrit en
    Août 2008
    Messages
    542
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 542
    Par défaut
    Merci bien d'avoir pris le temps de repondre
    On est obligé de déclarer les variables en property ?

  5. #5
    Membre Expert
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Par défaut
    pas obligatoirement si tu ne compte pas dériver ta classe ou que personne ne compte le faire.

    mais c'est plus simple, surtout quand on mets des getters/setters
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  6. #6
    Membre Expert

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Par défaut
    Citation Envoyé par Jcpan Voir le message
    je peux accéder et modifier la variable id depuis une autre classe alors qu'elle est déclaré protected dans la classe Treg.
    même chose si on met dans private

    est ce normale? je ne comprend pas.
    Delphi ne possède pas la notion de classe amie, ou de visibilité package des autres langages. C'est pourtant parfois bien pratique, voir indispensable si on veut pouvoir exposer une méthode à une classe utilitaire pour un usage donnée et qu'on ne veut pas la rendre visible pour les autres.

    Pour "contourner" cette limitation (je dis contourner parce que quelque part, c'est la façon d'implémenter les classes amie de Delphi), les classes déclarées dans la même unités sont automatiquement "amies" et peuvent accéder aux membre privés et protégés des autres.

    Ce mécanisme de visibilité a été renforcé à partir de BDS2006 avec la visibilité strict private et strict protected. Ces deux visiiblités correspondent à la définition traditionnelle des visibilités privé et protégé : Une classe ne peut pas accéder aux membres strict private d'une autre classe, même si elles sont définies dans la même unité.

    A noter qu'en même que cette protection s'applique au niveau de la classe et pas au niveau de l'instance. Deux instances de la même classe peuvent accéder aux membres strict private de l'autre.
    Il me semble que ce n'est pas le cas dans d'autres langages comme Java, où la protection s'applique à l'instance.

  7. #7
    Membre éclairé
    Avatar de Jcpan
    Inscrit en
    Août 2008
    Messages
    542
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 542
    Par défaut
    tite question, et ce que delphi a ces specifications (non standard) en ce qui concerne la POO, vu les editeurs venlent garder la compatibilité à travers les versions ?

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/06/2009, 10h54
  2. [PHP-JS] Récupérer une variable JS dans une variable PHP
    Par Perceuse-Killer dans le forum Langage
    Réponses: 2
    Dernier message: 07/02/2008, 15h34
  3. Réponses: 1
    Dernier message: 20/04/2007, 09h12
  4. [PHP-JS] mettre une variable javascript dans une variable php
    Par Mounr dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 20/04/2007, 09h09
  5. récupérer une variable javascript dans une variable java
    Par tx dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/07/2006, 17h55

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