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

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Ответить
Аватара пользователя
Tango
постоялец
Сообщения: 162
Зарегистрирован: 31.05.2012 17:07:30

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

Сообщение 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.
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

В рамках одного unit'а поля всех классов видны друг другу.

Теоретически это упрощает разработку связных друг с другом объектов, но на практике используется редко.
Аватара пользователя
vada
энтузиаст
Сообщения: 689
Зарегистрирован: 14.02.2006 12:43:17

Сообщение 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.
Аватара пользователя
Tango
постоялец
Сообщения: 162
Зарегистрирован: 31.05.2012 17:07:30

Сообщение Tango »

Всё понятно, спасибо.

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

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

А я вот как раз и не хочу это использовать, оно само используется.
iskander
энтузиаст
Сообщения: 630
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Tango писал(а):А я вот как раз и не хочу это использовать

Тогда объявляйте с видимостью strict private.
Vadim
долгожитель
Сообщения: 4111
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

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

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