Разница между "строгими частными" и "защищенными" модификаторами доступа в 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.