Изменение областей видимости — это ещё не все, что дает программисту Delphi. Язык предоставляет прекрасный аппарат свойств. Осваивая новый способ программирования, естественно ожидать не только методических преимуществ, но и удобств. Одно удобство нам дал механизм наследования. Однако, включив механизм инкапсуляции, т.е. скрыв поля от пользователя, мы потеряли возможность применять привычную операцию присваивания для доступа к значениям полей. Кроме того, пришлось создавать глупые методы заменяющие присваивание. Свойства компенсируют этот недостаток. Вот как это делается:
В классе TPoint мы объявили свойство x при помощи ключевого слова property. За именем свойства следует описание его типа, а затем — ключевое слово read и имя поля. Это означает, что чтобы получить значение свойства x необходимо прочесть значение поля Fx.
Далее следует ключевое слово write и имя того же поля. Это значит — чтобы изменить свойство x следует поместить значение в поле Fx. Обратите внимание, что поле Fx по–прежнему является скрытым, и что тип поля обязан совпадать с типом свойства. Свойство y определено аналогично.
Теперь программист может пользоваться присваиванием
alt='СВОЙСТВА'>
Зачем же было городить огород? Сделали бы поля public и все. Но обратите внимание на объявление класса TCircle. В нем для свойства r после write стоит SetR. В этом вся хитрость.
С применением свойств программы стали яснее, необходимость в тривиальных методах отпала, поля же по–прежнему скрыты, и программист может контролировать операции их чтения и изменения.
Метод записи свойства, в данном случае SetR, должен быть процедурой с одним параметром того же типа, что и свойство.
Для полноты иллюстрации введем в TPoint свойство From0 — расстояние от точки до начала координат. Во–первых его нельзя задавать независимо от координат Fx и Fy. Вообще лучше от греха подальше не иметь такого поля, а каждый раз вычислять расстояние, исходя из значений координат. Вот как здесь работают свойства.
В определении свойства From0 отсутствует ключевое слово write. Значит присваивание ему не допускается. Свойство доступно только для чтения . Чтобы получить значение этого свойства будет вызвана функция Dist. Например, a.From0 > 10, в действительности означает a.Dist > 10.
Обратите внимание на то, что методом чтения свойства, в данном случае Dist, должна быть функция без параметров, имеющая тот же тип, что и свойство. Функцию доступа можно описать как скрытую, ведь она не обязана упоминаться в программе.
Теперь различие между полями и свойствами видно окончательно. В частности, свойству From0 вообще не соответствует ни какого поля. Свойства в Delphi настолько удобны, что почти нет противопоказаний для замены всех полей на свойства. В их именах не используется и префикс F. Пожалуй единственное неудобство состоит в том, что свойства нельзя передавать как параметры–переменные в процедуры и функции.
Опубликовал Kest
May 29 2011 21:31:43 ·
0 Комментариев ·
5598 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.