Классы

Инкапсуляция

Инкапсуляция (Encapsulation) – скрытие данных для обеспечения максимально возможной независимости объектов. Доступ к данным только с использованием методов работы с ними внутри класса. Инкапсуляция позволяет:

  • Скрыть от внешнего мира внутреннюю структуру объекта, допуская взаимодействие с ним только через разрешенные каналы связи. Это исключает возможность неправильных действий над данными со стороны внешнего мира.
  • Изменять в процессе разработки каждый класс без влияния на остальную часть программы.

Наследование

Наследование (Inheritance)- создание новых классов-потомков, которые обладают всеми свойствами классов-предков. Целесообразно при создании нового класса использовать свойства имеющегося класса. Исходный класс называется предок, производный – потомок. Класс-потомок наследует все описания и методы класса-предка. Для него нужно описать только дополнительные свойства. Классы образуют иерархическое дерево.

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

Полиморфизм

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

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

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

Создание класса

Новые классы объявляются в разделе типов type.

type
<Имя класса> = class(<Имя предка>)
описание новых данных;
заголовки новых методов;

end;

Класс должен быть объявлен до создания объектов класса. Каждый объект имеет уникальную копию полей класса, но все объекты класса используют одни и те же методы. Объекты создаются при исполнении программы в динамической памяти. Для создания объекта используется метод constructor, а для уничтожения – destructor.

Поля класса

Поля класса – данные, содержащиеся в классе. Описываются, как переменная любого типа. Поля могут быть любого типа, в том числе и классами. По соглашению имена полей начинают с префикса F (field – поле). Для скрытия от внешнего мира структуры класса поля обычно размещаются в группе частных описаний private. Доступ к ним осуществляется через свойства.

type

TNewClass=class(TObject)

private

FCode:integer;

FSign:char;

FNote:string;

end;

Рекомендуется обращаться к полям с помощью методов класса. Допускается (но не рекомендуется) и прямое обращение. Например,

TNewClass.FNote:=’Pascal‘;

При компиляции оно будет автоматически преобразовываться в вызов метода класса.

Свойства класса

Свойство – средство доступа к полям, которые прямо не доступны. Свойства (они published) дают доступ к полям, напрямую недоступным (они private). Формат свойства:

property <Имя>[Индексы]:<Тип> index <Число> Спецификаторы;

Имя имеет индексы, если свойство – массив. index <Число> присутствует, если свойство – массив.  Спецификаторы – определяют действия со свойствами:

Спецификатор Назначение
read Читать свойство
write Писать свойство

Пример:

type

TNewClass=class(TObject)

private

FCode:integer;

FNote:string;

published

property Code:Integer read FCode write FCode;

property Note:String read FNote;

end;

Методы класса/объекта

Метод – подпрограмма (процедура или функция), являющаяся членом класса. Объектные методы подобны обычным процедурам и функциям, только они имеют еще экстра-параметр self.

Формат вызова метода: <Объект>.<Метод>. Метод объявляется в классе, как обычная подпрограмма с директивой forward. В описании класса находится заголовок метода, а код метода в разделе реализации метода, где имеет составное имя, включающее тип класса. Способ вызова метод, объявленного в классе, задается модификатором метода, вводимым после заголовка метода через точку с запятой. Если модификатора нет, то метод считается статическим и вызывается, как обычная подпрограмма.  Методы могут быть:

Метод Модификатор Описание
Абстрактный abstract Родоначальник  для потомков.
Наследуемый Наследуется у класса-предка.
Статический Подключается компилятором.
Виртуальный virtual Запускается при прогоне программы.
Повторный reintroduce Запускается повторно.
Перекрывающий override Имеет имя, как у метода класса-предка. Или модифицирован, или совсем другой.
Сообщение message Обработка сообщений.

Классы имеют виртуальные методы, а объекты – нет. Это и есть отличие между ними. Для объектов достаточно переобъявить тот же метод в объекте потомка с ключевым словом virtual для перекрытия. Для классов ситуация несколько иная: виртуальные методы должны быть перекрыты с ключевым словом override. Если так не сделать, запустится тот же виртуальный метод, скрывающий предыдущий. Ключевое слово Inherited не перескочит на унаследованный метод, если было использовано virtual.

Абстрактный метод

Абстрактными называются методы, которые определены в классе, но не содержат никаких действий, никогда не вызываются и обязательно должны быть переопределены в потомках класса. Абстрактные методы определены в классах, основное предназначение которых – быть родоначальником иерархии конкретных классов и дать возможность абстрагироваться от частностей. Абстрактными могут быть только виртуальные и динамические методы. В FPC такие методы объявляются с помощью одноименной директивы. Она указывается при описании метода:

procedure NeverCallMe; virtual; abstract;

Статический метод

Статический метод  «подключается» при компиляции, т.е. его код размещается в статической памяти. Методы по умолчанию статические. При вызове такого метода его реализация определяется типом переменной объекта, для которого метод вызывается, а не именем метода. В примере две реализации метода Draw.

Виртуальные методы

Эти методы загружаются при прогоне программы. Поэтому в отличие от статических могут перекрываться у классов-потомков. При вызове такого метода его реализация определяется не типом переменной объекта, для которого метод вызывается, а типом вызываемого метода. В примере три реализации метода Draw. Чтобы сделать метод таким, нужно в объявление метода добавить модификатор virtual или dynamic. При создании объекта конструктор заносит адреса методов в таблицу виртуальных методов TVM или в таблицу динамических методов TDM. По этим адресам при прогоне вызывается требуемый метод.

Перекрывающий метод

Перекрывающий метод в классе-потомке помечается модификатором override. Этот метод должен согласовываться м переопределяемым методом класса-предка по аргументам. Статические методы перекрываться не могут. Часто в перекрывающем методе используются коды методов классов-предков. При этом требуется ссылка на метод класса-предка. Для этого предназначено слово inherited (унаследованный). Оно может применяться в двух вариантах:

  • inherited <Метод>. Наследуется указанный метод. Выбирается от ближайшего класса-предка.
  • inherited. Наследуется метод с тем же именем, что у класса-потомка. Выбирается от ближайшего класса-предка.
TwitterSEO CommunityВаау!News2.ruChippKoricaSMI2Google BookmarksDiggI.uaЗакладки YandexLinkstoreMyscoopCommunizmRu-marksWebmarksRuspaceLinkomaticKli.kzWeb-zakladkaZakladok.netRedditdeliciousMa.gnoliaTechnoratiSlashdotYahoo My WebБобрДобр.ruMemori.rurucity.comМоёМесто.ruMister Wong

Copyright © 2009-2010 Программирование на паскале.