Тема 1.2 Создание и использование объектов
Тема 1.2.1 Понятие класса, объекта. Поля, методы, свойства объектов
Класс — это тип данных, определяемый пользователем. Класс должен быть объявлен до того, как будет объявлена хотя бы одна переменная этого класса. То есть класс не может объявляться внутри объявления переменной. Класс должен объявляться с областью видимости программа или модуль.
Синтаксис объявления класса следующий:
Туре
<имя класса> = Class (<имя класса — родителя>}
public // доступно всем
<поля, методы, свойства, события>
published , // видны в Инспекторе Объекта и изменяемы
<поля, свойства>
protected // доступ только потомкам
<поля, методы, свойства, события>
private // доступ только в модуле
<поля, методы, свойства, события>
end;
Имя класса может быть любым допустимым идентификатором. Но принято идентификаторы большинства классов начинать с символа «Т». Имя класса — родителя может не указываться. Тогда предполагается, что данный класс является непосредственным наследником TObject — наиболее общего из предопределенных классов. Таким образом, эквивалентны следующие объявления:
type TMyClass = class
end;
И
type TMyClass = class(TObject)
end;
Класс наследует поля, методы, свойства, события от своих предков и может отменять какие-то из этих элементов класса или вводить новые. Доступ к объявляемым элементам класса определяется тем, в каком разделе они объявлены.
|
|
Раздел public (открытый) предназначен для объявлений, которые доступны для внешнего использования. Это открытый интерфейс класса. Раздел published (публикуемый) содержит открытые свойства, которые появляются в процессе проектирования на странице свойств Инспектора Объектов и которые, следовательно, пользователь может устанавливать в процессе проектирования. Раздел private (закрытый), содержит объявления полей, процедур и функций, используемых только внутри данного класса. Раздел protected (защищенный) содержит объявления, доступные только для потомков объявляемого класса. Как и в случае закрытых элементов, можно скрыть детали реализации защищенных элементов от конечного пользователя. Однако, в отличие от закрытых, защищенные элементы остаются доступны для программистов, которые захотят производить от этого класса производные объекты, причем не требуется, чтобы производные объекты объявлялись в этом же модуле.
Объявления полей выглядят так же, как объявления переменных или объявления полей в записях:
<имя поля>: <тип>;
Объявления методов в простейшем случае также не отличаются от обычных объявлений процедур и функций.
Поля данных, исходя из принципа инкапсуляции , всегда должны быть защищены от несанкционированного доступа. Доступ к ним, как правило, должен осуществляться только через свойства, включающие методы чтения и записи полей. Поэтому поля целесообразно объявлять в разделе private — закрытом разделе класса. В редких случаях их можно помещать в protected — защищенном разделе класса, чтобы возможные потомки данного класса имели к ним доступ. Традиционно идентификаторы полей совпадают с именами соответствующих свойств, но с добавлением в качестве префикса символа 'F'.
|
|
Свойство объявляется оператором вида:
property <имя свойства>;<тип>
read <имя поля или метода чтения>
write <имя поля или метода записи>
<директивы запоминания>;
Если в разделах read или write этого объявления записано имя поля, значит предполагается прямое чтение или запись данных.
Если в разделе read записано имя метода чтения, то чтение будет осуществляться только функцией с этим именем. Функция чтения — это функция без параметра, возвращающее значение того типа, который объявлен для свойства. Имя функции чтения принято начинать с префикса Get, после которого следует имя свойства.
Если в разделе write записано имя метода записи, то запись будет осуществляться только процедурой с этим именем. Процедура записи — это процедура с одним параметром того типа, который объявлен для свойства. Имя процедуры записи принято начинать с префикса Set, после которого следует имя свойства.
|
|
Если раздел write отсутствует в объявлении свойства, значит это свойство только для чтения и пользователь не может задавать его значение.
Директивы запоминания определяют, как надо сохранять значения свойств при сохранении пользователем файла формы .dfm.
При описании нового класса можно добавлять новые методы и свойства, оставляя методы и свойства родителей, а можно родительские методы и свойства переопределить или перегрузить.
Имеется четыре вида методов: статические, виртуальные, динамические и абстрактные.
По умолчанию все методы статические. Если в классе — наследнике переопределить такой метод (ввести новый метод с тем же именем), то для объектов этого класса новый метод отменит родительский. Если обращаться к объекту этого класса, то вызываться будет новый метод. Но если обратиться к объекту как к объекту родительского класса, то вызываться будет метод родителя.
Виртуальные и динамические методы не связаны с другими методами с тем же именем в классах — наследниках. Если в классах — наследниках эти методы перегружены, то при обращении к такому методу во время выполнения будет вызываться тот из методов с одинаковыми именами, который соответствует классу объекта, указанному при вызове.
|
|
Абстрактный метод — это виртуальный или динамический метод, реализация которого не определена в том классе, в котором он объявлен. Предполагается, что этот метод будет перегружен в классах — наследниках. Только в тех классах, в которых он перегружен, его и можно вызывать.
Объявляется абстрактный метод с помощью ключевого слова abstract после слова virtual или dynamic.
Например:
procedure DoSomething; virtual; abstract;
Любой метод (и статический, и виртуальный) может быть перегружен с помощью ключевого слова overload. Для виртуальных методов в этих случаях надо еще добавить ключевое слово reintroduce. Если перегруженные таким образом методы различаются числом или типом параметров (так называемой сигнатурой), то при вызове метода из класса — наследника будет вызываться тот метод, список параметров которого соответствует списку аргументов.
При реализации метода, переопределенного любым способом в классе — наследнике, можно вызывать метод класса — родителя. Для этого перед именем метода при его вызове записывается ключевое слово inherited. Например, оператор
inherited create (...);
вызывает метод Create родителя.
Если записать слово inherited и после него не писать имя вызываемого метода, то будет вызываться наследуемый метод, совпадающий по имени с именем того метода, из которого он вызывается. Например, если в переопределяемом конструкторе встречается оператор
inherited; то будет вызван конструктор родительского класса.
Дата добавления: 2018-08-06; просмотров: 331; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!