Если есть Ссылка на класс,то мы можем обращаться к методам класса 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Если есть Ссылка на класс,то мы можем обращаться к методам класса



Посмотреть пример программы про фигуры.

Свойства классов в Delphi (property). Описание и использование свойств.

Поля, свойства и методы

Поля класса являются переменными, объявленными внутри класса. Они предназначены для хранения данных во время работы экземпляра класса (объекта). Ограничений на тип полей в классе не предусмотрено. В описании класса поля должны предшествовать методам и свойствам. Обычно поля используются для обеспечения выполнения операций внутри класса.

Примечание

При объявлении имен полей принято к названию добавлять заглавную букву F. Например FSomeField.

Итак, поля предназначены для использования внутри класса. Однако класс должен каким-либо образом взаимодействовать с другими классами или программными элементами приложения. В подавляющем большинстве случаев класс должен выполнить с некоторыми данными определенные действия и представить результат.

Для получения и передачи данных в классе применяются свойства. Для объявления свойств в классе используется зарезервированное слово property.

Свойства представляют собой атрибуты, которые составляют индивидуальность объекта и помогают описать его. Например, обычная кнопка в окне приложения обладает такими свойствами, как цвет, размеры, положение. Для экземпляра класса "кнопка" значения этих атрибутов задаются при помощи свойств — специальных переменных, определяемых ключевым словом property. Цвет может задаваться свойством Color, размеры — свойствами Width и Height и т. д.

Так как свойство обеспечивает обмен данными с внешней средой, то для доступа к его значению используются специальные методы класса. Поэтому обычно свойство определяется тремя элементами: полем и двумя методами, которые осуществляют его чтение/запись:

type

TAnObject = class(TObject)

function GetColor: TSomeType;

procedure SetColor(ANewValue: TSomeType);

property AColor: TSomeType read GetColor write SetColor;

end;

В данном примере доступ к значению свойства AColor осуществляется через вызовы методов GetColor и SetColor. Однако в обращении к этим методам в явном виде нет необходимости: достаточно написать:

AnObject.AColor:= AValue;

AVariable:= AnObject.AColor;

и компилятор самостоятельно оттранслирует обращение к свойству AColor в вызовы методов Getcolor или Setcolor. Tо есть внешне свойство выглядит в точности как обычное поле, но за всяким обращением к нему могут стоять нужные вам действия. Например, если у вас есть объект, представляющий собой квадрат на экране, и его свойству "цвет" вы присваиваете значение "белый", то произойдет немедленная перерисовка, приводящая реальный цвет на экране в соответствие со значением свойства. Выполнение этой операции осуществляется методом, который связан с установкой значения свойства "цвет".

В методах, входящих в состав свойств, может осуществляться проверка устанавливаемой величины на попадание в допустимый диапазон значений и вызов других процедур, зависящих от вносимых изменений. Если же потребности в специальных процедурах чтения и/или записи нет, можно вместо имен методов применять имена полей. Рассмотрим следующую конструкцию:

TPropObject = class(TObject)

FValue: TSomeType;

procedure DoSomething;

function Correct(AValue: Integer):boolean;

procedure SetValue(NewValue: Integer);

property AValue: Integer read FValue write SetValue;

end;

...

procedure TPropObject.SetValue(NewValue: Integer);

begin

if (NewValueoFValue) and Correct(NewValue) then EValue:= NewValue;

DoSomething;

end;

В этом примере чтение значения свойства AValue означает просто чтение поля rvalue. Зато при присвоении значения внутри SetValue вызывается сразу два метода.

Если свойство должно только читаться или записываться, в его описании может присутствовать соответствующий метод:

type

TAnObject = class(TObject)

property AProperty: TSomeType read GetValue;

end;

В этом примере вне объекта значение свойства можно лишь прочитать; попытка присвоить свойству AProperty значение вызовет ошибку компиляции.

Для присвоения свойству значения по умолчанию используется ключевое слово default:

property Visible: boolean read FVisible write SetVisible default True;

Это означает, что при запуске программы свойство будет установлено компилятором в True.

Свойство может быть и векторным; в этом случае оно внешне выглядит как массив:

property APoints[Index: Integer]:TPoint read GetPoint write SetPoint;

На самом деле в классе может и не быть соответствующего поля — массива. Напомним, что вся обработка обращений к внутренним структурам класса может быть замаскирована.

Для векторного свойства необходимо описать не только тип элементов массива, но также имя и тип индекса. После ключевых слов read и write в этом случае должны стоять имена методов — использование здесь полей массивов недопустимо. Метод, читающий значение векторного свойства, должен быть описан как функция, возвращающая значение того же типа, что и элементы свойства, и имеющая единственный параметр того же типа и с тем же именем, что и индекс свойства:

function GetPoint(Index:Integer):TPoint;

Аналогично, метод, помещающий значения в такое свойство, должен первым параметром иметь индекс, а вторым — переменную нужного типа (которая может быть передана как по ссылке, так и по значению):

procedure SetPoint(Index:Integer; NewPoint:TPoint);

У векторных свойств есть еще одна важная особенность. Некоторые классы в Delphi (списки т-List, наборы строк TStrings) "построены" вокруг основного векторного свойства (см. гл. 7). Основной метод такого класса дает доступ к некоторому массиву, а все остальные методы являются как бы вспомогательными. Специально для облегчения работы в этом случае векторное свойство может быть описано с ключевым словом default:

type

TMyObject = class;

property Strings[Index: Integer]: string read Get write Put; default;

end;

Если у объекта есть такое свойство, то можно его не упоминать, а ставить индекс в квадратных скобках сразу после имени объекта:

var AMyObject: TMyObject;

begin

...

AMyObject.Strings[1]:= 'First'; {первый способ}

AMyObject[2]:= 'Second'; (второй способ}

...

end.

Будьте внимательны, применяя зарезервированное слово default, — как мы увидели, для обычных и векторных свойств оно употребляется в разных случаях и с различным синтаксисом.

О роли свойств в Delphi красноречиво говорит следующий факт: у всех имеющихся в распоряжении программиста стандартных классов 100% полей недоступны и заменены базирующимися на них свойствами. Рекомендуем при разработке собственных классов придерживаться этого же правила.

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

http://256bit.ru/Delphi7/Glava1/Index3.html

http://256bit.ru/Delphi7/

 

или другой вариант(ЛУЧШЕ)

Свойство (property), подобно полю, является атрибутом, некоторой характеристикой объекта. Однако, в отличие от поля, которое просто является областью для хранения некоторого данного, свойство ассоциировано со специфическими действиями по чтению и модификации данных свойства. Значения свойств вообще могут не существовать в памяти, например, они могут быть прочитаны из базы данных, вычислены и т.д.

Свойства обеспечивают контроль над доступом к данным и позволяют достичь двух основных положительных эффектов:

· упрощение доступа к полям данных, которые, в соответствии с парадигмами ООП, должны быть закрытыми (private);

· гарантированное выполнение обязательных операций, которые должны быть выполнены при получении значений свойств или их модификации.

Описание свойства определяет его имя, тип и по крайней мере один спецификатор доступа:

property propertyName[indexes]: type index integerConstant specifiers;

Элементы описания свойства имеют такой смысл.

PropertyName любой допустимый идентификатор, являющийся именем свойства.

Элемент [indexes] не является обязательным и используется для описания свойств-массивов.

Элемент описания type должен быть идентификатором типа свойства и не может быть определением типа. Тип свойства может быть одним из следующих:

v любой порядковый, вещественный или строковый;

v множество set;

v класс или интерфейс.

Зарезервированное слово index и integerConstant являются необязательными и используются в том случае, если несколько свойств используют одни и те же методы для доступа к значениям свойств.

Спецификаторы specifiers – это последовательность зарезервированных слов read, write, stored, default (или nodefault) и implements, которая включает и другие, дополнительные идентификаторы.Любое свойство должно иметь по крайней мере один спецификатор read или write. Спецификатор implements относится к интерфейсам и будет рассмотрен позже.

Доступ к свойствам (property access).

Каждое свойство имеет спецификатор read, write или оба. Они называются спецификаторами доступа и имеют такой формат:

read fieldOrMethod

write fieldOrMethod

Здесь fieldOrMethod идентификатор поля или метода, объявленного в том же классе или в родительском классе. Если fieldOrMethodобъявлены в этом же классе, они должны быть описаны выше, т.е. до описания свойства (в классе). Если они объявлены в родительском классе, то должны быть видимы в классе наследнике.

Если fieldOrMethod является полем, то оно должно быть того же типа, что и свойство.

Если в спецификаторе read fieldOrMethod является методом, то это должна быть функция без параметров, возвращающая значение того же типа, что и свойство.

Если в спецификаторе write fieldOrMethod является методом, то это должна быть процедура с единственным параметром того же типа, что и свойство. Параметр должен быть параметром значением или константой.

Таким образом, при наличии такого описания свойства

property Color: TColor read GetColor write SetColor;

метод GetColor должен быть объявлен как

function GetColor: TColor;

и процедура SetColor как

procedure SetColor(Value: TColor);

procedure SetColor(const Value: TColor);

Разумеется, что имя параметра, как и имена методов, могут быть любыми.

Когда свойство встречается в выражении, его значение читается из поля или с помощью функции, определенной спецификатором read. Если свойство появляется в левой части оператора присваивания, его значение записывается в поле или с помощью процедуры, указанных в спецификаторе write.

В приведенном ниже примере объявляется класс TCompass с опубликованным свойством Headin g. Значение этого свойства читается из поля FHeading и записывается с помощью процедуры SetHeading.

type

THeading = 0..359;

TCompass = class(TControl)

private

FHeading: THeading;

procedure SetHeading(Value: THeading);

published

property Heading: THeading read FHeading write SetHeading;

...

end;

С учетом приведенного описания операторы

if Compass.Heading = 180 then GoingSouth;

Compass.Heading:= 135;

соответствуют следующим

if Compass.FHeading = 180 then GoingSouth;

Compass.SetHeading(135);

В этом классе чтение значения свойства не связано ни с какими действиями: просто читается поле FHeading. Присваивание же свойству нового значения выполняется с помощью процедуры, которая, возможно, тоже сохраняет значение свойства в поле FHeading, но при этом выполняет некоторые действия. Например, этот метод может быть реализован так:

procedure TCompass.SetHeading(Value: THeading);

begin

if FHeading <> Value then

begin

FHeading:= Value;

Repaint; // обновить пользовательский интерфейс для

// отображения нового значения

end;

end;

Свойство, чье описание включает только спецификатор read, является свойством только для чтения (read-only property). Если свойство включает только спецификатор write, оно называется свойством только для записи (write-only property). Попытка присвоить значение свойству только для чтения или получить значение свойства только для записи вызывает ошибку.



Поделиться:


Последнее изменение этой страницы: 2017-02-21; просмотров: 174; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.93.73 (0.029 с.)