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..
The difference between private, protected and public is pretty straightforward:
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;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With