Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.01.2008, 00:55   #1
FliPP
 
Аватар для FliPP
 
Регистрация: 03.01.2008
Сообщений: 9
Вопрос Свойства объектов (Delphi)

Для меня не совсем понятно, каким образом осуществляется связь между полем объекта и свойством этого поля. В примере в учебнике, при описании класса, названия поля и его свойства различаются только начальной буквой f (FName - поле, а Name - Свойство) Возможно в этом все и дело?!?! Других "указателей" принадлежности свойства полю я там не нашел. кстати вот этот пример:
Код:
type

TName = string[15]; 
TAddress = string[35];

TPerson = class
private
FName: TName; 
FAddress: TAddress; 
Constructor Create(Name:Tname);
Procedure Show;
Function GetName: TName;
Function GetAddress: TAddress;
Procedure SetAddress(NewAddress:TAddress);
public
Property Name: Tname
read GetName; 

Property Address: TAddress 
read GetAddress
write SetAddress;

end;
FliPP вне форума Ответить с цитированием
Старый 03.01.2008, 01:44   #2
Jeni
Форумчанин
 
Регистрация: 31.05.2007
Сообщений: 486
По умолчанию

Цитата:
Сообщение от FliPP Посмотреть сообщение
В примере в учебнике, при описании класса, названия поля и его свойства различаются только начальной буквой f (FName - поле, а Name - Свойство) Возможно в этом все и дело?!?!
Дело совершенно не в этом! Как называется поле и связанное с ним свойство - личное дело программиста. Они связаны друг с другом так же, как название переменной с её реальным значением, т.е. никак! Просто "правила хорошего тона" рекомендуют такие названия, чтобы при просмотре исходных текстов по имени поля можно было сразу понять название свойства и наоборот. Свойства просто "маскируют" работу с полями объектов и приводят всё к единообразному виду, т.е. программист, используя свойства работает "как бы" с обычными переменными, а на самом деле компилятор вместо этого подставляет "правильные" вызовы.

Что касается конкретного примера, если P: TPerson
X := P.Address; преобразуется в X := P.GetAddress;
P.Addres := X преобразуется в P.SetAddress(X) - в действительности вызывается процедура (т.е. метод) куда в качестве параметра передается X, а уже в процедуре SetAddress значение X как-то записывается в переменную FAddress (или любую другую).
Если бы не было свойств, то все эти вызовы методов пришлось бы писать программисту, а со свойствами выглядит так, будто идет присвоение обычных переменных. Вот и всё.

Тут, конечно, можно спросить, а нафига вообще вызывать какие-то методы вместо того, чтобы прямо читать/писать из/в FAddress? А дело в том, что иногда (и даже часто) требуется:
1. Выполнить определенную проверку вводимых данных. Например, вдруг фамилия должна записываться только большими буквами? Если писать "напрямую", то в FAddress данные запишутся в том виде, в каком будут в переменной X, а вот если "скрытно" вызывается SetAddress, то данные сначала преобразуются как требуется, а уже затем запишутся на хранение в FAddress.
2. Возможно потребуется выполнить другие действия, например, "оповестить" другие объекты об изменении/добавлении данных в этом объекте. Или записать в лог-файл кто/когда/откуда внес эту запись.
3. Ещё пару тысяч возможных причин...

Последний раз редактировалось Jeni; 03.01.2008 в 01:58.
Jeni вне форума Ответить с цитированием
Старый 04.01.2008, 01:52   #3
FliPP
 
Аватар для FliPP
 
Регистрация: 03.01.2008
Сообщений: 9
Печаль

Ясно. но я все равно не до конца понял, каким образом компилятор определяет, к какому полю принадлежит это свойство?! Почему ,например свойство Name относится к полю fName, а не к fAddress??? ведь там же не написано конкретно: свойство *** - свойство поля f***!!!! или важен порядок описания полей и их свойств????
FliPP вне форума Ответить с цитированием
Старый 04.01.2008, 02:19   #4
Jeni
Форумчанин
 
Регистрация: 31.05.2007
Сообщений: 486
По умолчанию

Порядок описания полей и методов не важен (хотя требуется, чтобы поля были описаны перед методами). Если бы свойство было записано так:
Property Address: TAddress read FAddress write FAddress;
то компилятор бы действительно "определил" что с чем связано.

Но в примере написано по-другому:
Property Address: TAddress read GetAddress write SetAddress;
Это означает, что компилятор понятия не имеет, что свойство Address связано с переменной FAddress - эта "связь" задается в методах GetAddress и SetAddress.

Я конечно не знаю конкретной реализации, но в качестве примера:
Код:
Function TPerson.GetAddress: TAddress;  
begin
  Result := FAddress;
end;
Код:
Procedure TPerson.SetAddress(NewAddress:TAddress);
begin
  // Возможно какая-то предварительная обработка строки
  FAddress := NewAddress;
  // Возможно какая-то постобработка строки
end;
Для свойства Name - аналогично.

Последний раз редактировалось Jeni; 04.01.2008 в 02:28.
Jeni вне форума Ответить с цитированием
Старый 05.01.2008, 00:46   #5
FliPP
 
Аватар для FliPP
 
Регистрация: 03.01.2008
Сообщений: 9
По умолчанию

Вот!!! Теперь все понятно!!! В учебнике не было приведено конкретной реализации методов, а я и не догадался, что в конкретном примере "связи" как таковой и нет то))) Спасибо за разъяснения!!!
FliPP вне форума Ответить с цитированием
Старый 05.01.2008, 04:09   #6
Jeni
Форумчанин
 
Регистрация: 31.05.2007
Сообщений: 486
По умолчанию

Рад, что помог. В книгах действительно часто всё описано формально правильно, но без объяснения "на пальцах" и отдельные тонкости и "внутренние механизмы" остаются непонятыми. Наверное потому, что авторам эти вещи кажутся настолько "ясными и так", что даже в голову не приходит, что другим оно вовсе не ясно.
Вобщем, как говорится, обращайтесь.
Jeni вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi: Проблема с созданием объектов Omedus Помощь студентам 4 08.08.2008 18:42
Свойства формы Teen4jump Общие вопросы Delphi 4 28.02.2008 01:29
Свойства файла ruPy Общие вопросы Delphi 2 11.01.2008 19:37
Свойства объекта KBak Win Api 5 15.08.2007 20:21
Свойства ярлыка Fainder Win Api 1 26.04.2007 15:26