Разница между "строго частным" и "защищенным" модификаторами доступа в Delphi? - PullRequest
19 голосов
/ 04 октября 2009

но я изучаю программирование и после структурированного программирования на языке Паскаль я начинаю изучать ООП с Delphi.

Итак, я не очень понимаю разницу между инструкцией strict private и protected. Итак, вот мой код, он о создании "мешка", это просто введение в урок моего Delphi, Учитель покажет нам, как мы можем создавать объекты:

    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;

Так что это просто пример создания объекта; Я понимаю, что такое публичное объявление (интерфейс доступен извне), но я не понимаю, в чем разница между частными и защищенными объявлениями .. Спасибо за попытку помочь мне ..

Ответы [ 5 ]

32 голосов
/ 04 октября 2009

Разница между частным, защищенным и общедоступным довольно проста:

  • Закрытые члены / методы видны только в классе, который их объявляет.
  • Защищенные члены / методы видны внутри класса, и для всех подклассов.
  • Открытые члены и методы видны всем остальным классам.

В 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;
6 голосов
/ 04 октября 2009

строгий приватный - видимый и доступный только из этого класса.

приватный - видимый и доступный только внутри этого класса и данного класса.

защищено - то же самое, что частный ПЛЮС из классов-потомков

Подробнее об идее инкапсуляции можно прочитать здесь: http://en.wikipedia.org/wiki/Encapsulation_%28computer_science%29#Encapsulation

5 голосов
/ 04 октября 2009

Вы могли бы искать это везде (ключевое слово будет "модификаторы доступа")

По сути, защищенный означает, что члены будут видны в дочерних классах и во всем подразделении. строгое закрытое означает, что у вас есть доступ к члену ТОЛЬКО в методах-членах этого класса.

4 голосов
/ 05 декабря 2011

В других ответах отсутствует один случай: 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.)

1 голос
/ 07 декабря 2011

В других ответах отсутствует еще один случай.Существуют возможности «расширить» правила инкапсуляции классов.

С помощью помощников классов, представленных в 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-защищенный-свойство-оф-а-Дельфи-класса .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...