Разница между "строгими частными" и "защищенными" модификаторами доступа в Delphi?
но я изучаю программирование и после структурированного программирования с языком Pascal, я начинаю узнавать о ООП с Delphi.
Итак, я действительно не понимаю разницу между инструкцией strict private
и protected
. Вот мой код, это о создании "сумки", это просто введение моего урока Дельфы, Учитель показывает нам, как мы можем создавать объекты:
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;
Итак, это просто пример создания объекта; Я понимаю, что такое публичная декларация (интерфейс, доступный снаружи), но я не вижу разницы между частными и защищенными объявлениями. Спасибо, что пытался помочь мне.
Ответы
Ответ 1
Разница между частным, защищенным и общедоступным довольно проста:
- Частные члены/методы видны только в классе, объявляющем их.
- Защищенные элементы/методы видны внутри класса и ко всем подклассам.
- Публичные элементы и методы видны для всех других классов.
В Delphi есть "ошибка", которая делает видимость всех участников общедоступными в пределах одной единицы. Строковое ключевое слово корректирует это поведение, так что частный является частным, даже в пределах одной единицы. Для хорошей инкапсуляции я бы рекомендовал всегда использовать строковое ключевое слово.
Пример кода:
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;
Ответ 2
строгий частный - видимый и доступный только изнутри этого класса.
private - видимый и доступный только из этого класса и этого класса.
protected - то же самое, что и private PLUS из классов потомков
Здесь вы можете узнать больше об идее инкапсуляции: http://en.wikipedia.org/wiki/Encapsulation_%28computer_science%29#Encapsulation
Ответ 3
Вы могли бы посмотреть это повсюду (ключевое слово будет "модификаторами доступа" )
В принципе, защищенный означает, что члены будут видны в дочерних классах и во всем модуле. строгое личное означает, что вы имеете доступ только к члену в методах членов этого класса.
Ответ 4
В других ответах отсутствует один случай: private
и даже strict private
поля других экземпляров могут быть доступны из кода внутри своего класса:
type
TSO1516493= class
strict private
A: Integer;
public
procedure ChangeOther(Param: TSO1516493);
end;
{ TSO1516493 }
procedure TSO1516493.ChangeOther(Param: TSO1516493);
begin
Param.A := -1; // accessing a strict private variable in other instance !
end;
(Это то же поведение, что и в Java.)
Ответ 5
Еще один случай отсутствует в других ответах.
Существуют возможности "расширить" правила инкапсуляции класса.
С помощью помощников класса, введенных в Delphi 8 (для совместимости с .NET), можно обойти
разница в видимости между частными, защищенными и публичными (и даже строгими обозначениями).
Объявление помощника класса может быть в другом блоке, чем исходный класс.
Это пример:
type
TMyOrgClass = class
strict private
FMyPrivateProp: Integer;
strict protected
property MyPrivateProp: Integer read FMyPrivateProp;
end;
TMyClassHelper = class helper for TMyOrgClass
private
function GetMyPublicProp: Integer;
public
property MyPublicProp: Integer read GetMyPublicProp;
end;
function TMyClassHelper.GetMyPublicProp: Integer;
begin
Result:= Self.FMyPrivateProp; // Access the org class members with Self
end;
Смотрите это сообщение для получения дополнительной информации: access-a-strict-protected-property-of-a-delphi-class.