Страница 1 из 1

Область видимости и личные данные

СообщениеДобавлено: 09.04.2014 15:16:39
Tango
Такая нестыковка.
Есть несколько классов, и некоторые поля объявляю в private, но по-прежнему могу обращаться к этим полям из других объектов.
Правильно ли это? Например так.

program project1;

type
TForm=class;
TLogOn=class;

{ TGrid }

TGrid=class
private
FForm:TForm;
FLogOn:TLogOn;
FBase:String;
public
constructor Create(Form:TForm);

end;

{ TForm }

TForm=class
private
FLogOn:TLogOn;
public
constructor Create(LogOn:TLogOn);

end;

{ TLogOn }

TLogOn=class
private
FBase:String;
public
constructor Create;

end;

{ TLogOn }

constructor TLogOn.Create;
begin
//
end;

{ TForm }

constructor TForm.Create(LogOn: TLogOn);
begin
FLogOn:=LogOn;
end;

{ TGrid }

constructor TGrid.Create(Form: TForm);
begin
FForm:=Form;
FLogOn:=FForm.FLogOn; // доступ к закрытым свойствам, легко!
FBase:=FLogOn.FBase; // здесь, тоже самое, как?
end;

begin
LogOn:=TLogOn.Create;
end.

Re: Область видимости и личные данные

СообщениеДобавлено: 09.04.2014 15:23:02
Дож
В рамках одного unit'а поля всех классов видны друг другу.

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

Re: Область видимости и личные данные

СообщениеДобавлено: 09.04.2014 15:24:19
vada
For objects, 3 visibility specifiers exist : private, protected and public. If a visibility specifier is not specified, public is assumed. Both methods and fields can be hidden from a programmer by putting them in a private section. The exact visibility rule is as follows:

Private
All fields and methods that are in a private block, can only be accessed in the module (i.e. unit or program) that contains the object definition. They can be accessed from inside the object’s methods or from outside them e.g. from other objects’ methods, or global functions.
Protected
Is the same as Private, except that the members of a Protected section are also accessible to descendent types, even if they are implemented in other modules.
Public
fields and methods are always accessible, from everywhere. Fields and methods in a public section behave as though they were part of an ordinary record type.

Re: Область видимости и личные данные

СообщениеДобавлено: 09.04.2014 15:39:23
Tango
Всё понятно, спасибо.

Добавлено спустя 43 секунды:
Дож писал(а):В рамках одного unit'а поля всех классов видны друг другу.

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

А я вот как раз и не хочу это использовать, оно само используется.

Re: Область видимости и личные данные

СообщениеДобавлено: 09.04.2014 17:54:32
iskander
Tango писал(а):А я вот как раз и не хочу это использовать

Тогда объявляйте с видимостью strict private.

Re: Область видимости и личные данные

СообщениеДобавлено: 09.04.2014 18:00:23
Vadim
iskander
iskander писал(а):Тогда объявляйте с видимостью strict private.

Или объявляйте и описывайте TForm в другом модуле. ;-)