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

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

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

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

Сообщение Tango » 09.04.2014 15:16:39

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

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

Сообщение Дож » 09.04.2014 15:23:02

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

Теоретически это упрощает разработку связных друг с другом объектов, но на практике используется редко.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

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

Сообщение vada » 09.04.2014 15:24:19

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.
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

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

Сообщение Tango » 09.04.2014 15:39:23

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

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

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

А я вот как раз и не хочу это использовать, оно само используется.
Аватара пользователя
Tango
постоялец
 
Сообщения: 162
Зарегистрирован: 31.05.2012 17:07:30

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

Сообщение iskander » 09.04.2014 17:54:32

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

Тогда объявляйте с видимостью strict private.
iskander
энтузиаст
 
Сообщения: 606
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение Vadim » 09.04.2014 18:00:23

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

Или объявляйте и описывайте TForm в другом модуле. ;-)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск


Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru