Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Difference between "strict private" and "protected" Access Modifiers in Delphi?

Tags:

but I learn programming and after structured programming with Pascal language, I'm beginning to learn about OOP with Delphi.

So, I don't really understand the difference between the strict private instruction and the protected one.. So here is my code, it's about a "bag" creation, it's just the introduction of my Delphi's lesson, teacher show us how we can create objects:

    uses   SysUtils;  Type    Tbag= class (Tobject)                                                               strict private                                                                       FcontenM : single;       Fcontent : single;     protected       function getisempty : boolean;       function getisfull: boolean;     public       constructor creer (nbliters : single);       procedure add     (nbliters : single);       procedure clear   (nbliters : single);       property contenM : single read FcontenM;       property content : single read Fcontent;       property isempty : boolean read getisempty;       property isfull : boolean read getisfull;     end;   function Tseau.getisempty;   begin     result := Fcontent = 0;   end;  function Tseau.getisfull;   begin     result := Fcontent = FcontenM;   end;  constructor Tseau.creer(nbliters: Single);   begin     inherited create;     FcontenM := nbliters;   end;  procedure Tbag.add (nbliters: Single);   begin     if ((FcontenM - Fcontent) < nbliters) then fcontent := fcontenM       else Fcontent := (Fcontent + nbliters);   end;  procedure Tbag.clear (nbliters: Single);   begin     if (Fcontent > nbliters) then Fcontent := (Fcontent - nbliters)       else Fcontent := 0;   end; 

So it's just an example of object creation; I understand what is public declaration (interface approachable by the outside) but I don't see what's the difference between private and protected declarations.. Thanks for trying to help me..

like image 959
bAN Avatar asked Oct 04 '09 14:10

bAN


1 Answers

The difference between private, protected and public is pretty straightforward:

  • Private members/methods are only visible within the class that declares them.
  • Protected members/methods are visible within the class, and to all subclasses.
  • Public members and methods are visible to all other classes.

In Delphi there's a "bug" that makes the visibility of all members public within the same unit. The strict keyword corrects this behaviour, so that private is actually private, even within a single unit. For good encapsulation I would recommend always using the strict keyword.

Example code:

type   TFather = class   private     FPriv : integer;   strict private     FStrPriv : integer;   protected     FProt : integer;   strict protected     FStrProt : integer;   public     FPublic : integer;   end;    TSon = class(TFather)   public     procedure DoStuff;   end;    TUnrelated = class   public     procedure DoStuff;   end;  procedure TSon.DoStuff; begin   FProt := 10;       // Legal, as it should be. Accessible to descendants.   FPriv := 100;      // Legal, even though private. This won't work from another unit!   FStrictPriv := 10; // <- Compiler Error, FStrictPrivFather is private to TFather   FPublic := 100;    // Legal, naturally. Public members are accessible from everywhere. end;  procedure TUnrelated.DoStuff; var   F : TFather; begin   F := TFather.Create;   try     F.FProt := 10;     // Legal, but it shouldn't be!     F.FStrProt := 100; // <- Compiler error, the strict keyword has "made the protection work"     F.FPublic := 100;  // Legal, naturally.   finally     F.Free;   end; end; 
like image 54
Svein Bringsli Avatar answered Sep 28 '22 08:09

Svein Bringsli