[Delphi] Différence entre private et public - Petit exemple ?

Bonjour à tous :slight_smile:

J’ai un petit soucis, je débute en delphi et j’ai vraiment du mal a comprendre la différence entre ces 2 types de déclarations public et private. J’ai trouvé ceci :

Si je comprends bien private sera composé par exemple d’une variable qui ne pourra pas être modifié ? Mais alors pourquoi peut-on grâce a PROPERTY WRITE allé modifié son contenu :pt1cable:

J’ai peur de ne pas tout comprendre :frowning: ! Est-ce que quelqu’un aurait un exemple concret … merci d’avance pour votre aide :wink:

Exemple :

Tsac=Class
    private
    Fcontenance:double;
    Fcontenu:double;
  public
    CONSTRUCTOR Creation(value:double);
    procedure Remplir(value:double);
    procedure Vider(value:double);
    property contenance:double read Fcontenance;
    property contenu:double read Fcontenu;
    function vide : boolean;
    function plein : boolean;

  end;


var
  fen: Tfen;
  Sac:Tsac;

Si je mets Sac. dans ma classe fenêtre il me propose Sac.Fcontenance je ne devrais pas y avoir accès !?

procedure Tfen.Button1Click(Sender: TObject);
begin
Sac.Fcontenance:=15;
end;

:heink:

C’est de la POO que tu fais avec Delphi, et public, private et protected te permettent de :

  1. public : la propriété est publique, et n’importe qui peut y accéder. Imagine un peu que tes yeux soient publiques, et que tout le monde y touche…

  2. private : la propriété est privée, et seul la classe englobante peut y toucher. Là, c’est bon : tes yeux sont innacessibles aux autres.

  3. protected : la propriété est partagée. Imagine que tu ai des enfants, et que tu as un héritage génétique : ben pouf, ils en profitent!

Enfin, Delphi permet aussi de définir des méthodes d’écritures sur les propriétés. L’avantage c’est d’avoir un setter & un getter sans devoir faire appel à une fonction : le compilateur le fait automatiquement.

oki merci pour les renseignements :slight_smile: Cependant je viens de faire un petit test et je peux écrire malgré la variable en private :

Sac1.x:=30; ==> ne devrait pas fonctionner je pense :slight_smile:

unit Unit4;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm4 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

  type
  TSac = class
  private
  x:integer;
  public
    y:integer;
    CONSTRUCTOR create;
    procedure modif;
  end;

var
  Form4: TForm4;
  Sac1:TSac;
  Sac2:TSac;

implementation

{$R *.dfm}

CONSTRUCTOR TSac.create;
begin
     inherited create;
     x:=15;

end;

procedure TForm4.Button1Click(Sender: TObject);
begin
Sac1:=TSac.create;
Sac2:=TSac.create;
end;

procedure TSac.modif;
begin
      x:=25;
end;

procedure TForm4.Button2Click(Sender: TObject);
begin
Sac2.modif;
Sac1.x:=30;                                 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Form4.Edit1.Text:=FloatToStr(Sac1.x);
Form4.Edit2.Text:=FloatToStr(Sac2.x);
end;

end.

Si tu as mis un setter, c’est normal je dirais. Ceci dit je ne fais plus de delphi depuis longtemps…

je ne sais même pas ce que c’est donc :whistle:

j’imagine qu’il parle d’une fontion genre “getcontenance()”, ou “setcontenance()” (getter ou setter) accessible en public, qui se charge de lire ou ecrire la valeur privée…
A confirmer

Bon en fait je pense avoir compris :slight_smile:

Dés que l’on déclare une variable en private on ne doit pas l’utiliser dans le code si je comprends bien ( sauf dans la classe en elle même ),donc on utilise PROPERTY avec une limite de write ou de read et on se sert de cette propriété pour lire la variable a partir d’une autre classe.

J’ai juste ou je suis toujours à coté de la plaque :stuck_out_tongue: