2009-10-04 4 views
16

но я изучаю программирование и после структурированного программирования на языке Pascal, я начинаю узнавать о ООП с Delphi.Разница между «строгими частными» и «защищенными» модификаторами доступа в 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; 

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

ответ

28

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

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

В 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; 
+10

Это не ошибка, это ожидаемое поведение, и VCL использует его совсем немного. –

+6

Вот почему я написал «bug» :-) Так работает Delphi, но это не стандартный OOP. –

+10

Итак, кто определил, что такое «стандартный ООП»? Я не знал, что существует несколько советов стандартов ООП. ООП просто определяет парадигму, сосредоточенную вокруг инкапсуляции, наследования и полиморфизма. Существует не строгое (каламбурное) правило о том, как должны быть реализованы модификаторы доступа. Чтобы лучше разъяснить, правила доступа реализуют неявную «дружбу» на уровне единицы без добавления явного синтаксиса для этого. –

4

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

В принципе, защищенный означает, что члены будут видны в дочерних классах и на всей единице. строгое личное означает, что вы имеете доступ только к члену в методах участника этого класса.

5

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

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

защищены - такой же, как частное PLUS внутри классов-потомков

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

3

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

0

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

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