Тема 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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






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