- •Обзорная лекция по курсу: «Основы ооп»
- •5 Основные механизмы ооп
- •6 История создания объектно-ориентированных систем программирования
- •7 Определение класса
- •Таким образом, структура модуля, содержащего описание класса, приблизительно выглядит следующим образом:
- •8 Конструкторы и деструкторы
- •9 Наследование в Object Pascal. Правила наследования.
- •10 Реализация событий на уровне языка Object Pascal
- •11 Понятие «исключительная ситуация»
8 Конструкторы и деструкторы
Конструктор – это метод особого вида, который создает объекты и делает для них начальные установки. Заголовок конструкторов начинается с ключевого слова constructor.
Отметим, что в качестве имен конструкторов, в отличие от Borland Pascal, в котором применялся идентификатор Init, в Object Pascal рекомендуется использовать идентификатор Create. При создании нового объекта конструктор всегда вызывается с помощью ссылки на имя класса.
SimpleVar := TSimpleClass.Create;
Деструктор представляет собой специальный вид метода, который удаляет объекты и освобождает занимаемую ими память. Деструкторы объявляются с использованием ключевого слова destructor вместо слова procedure.
Аналогично конструкторам, для которых рекомендуется использовать одинаковый идентификатор Create, для всех деструкторов рекомендуется использовать имя Destroy.
Деструкторы по-другому еще называют "сборщиками мусора". Как правило, деструктор объединяет все действия по освобождению памяти так, чтобы очистку можно было выполнить за один вызов деструктора.
9 Наследование в Object Pascal. Правила наследования.
Наследование – это такое соотношение между классами, когда один класс использует структурную или функциональную часть одного или нескольких других классов (соответственно простое или множественное наследование).
В Object Pascal реализовано простое наследование, при котором у класса может быть только один родитель, но сколь угодно потомков.
Любой класс можно объявить потомком ранее описанного класса. Потомок наследует все данные и методы класса родителя и дополняет их своими данными и методами.
В результате использования механизма наследования отпадает необходимость заново описывать уже существующие в классе-родителе поля и методы. Требуется описать только те поля и методы, которых недостает в классе-родителе.
Факт наследования каким-либо типом характеристик родительского типа обозначается указанием после ключевого слова class имени непосредственного родителя, которое заключается в круглые скобки.
Наследование дочерними типами информационных полей и методов их родительских типов выполняется согласно следующим правилам:
Правило 1: Информационные поля и методы родительского типа наследуются всеми его дочерними типами независимо от числа промежуточных уровней иерархии.
Правило 2: Доступ к полям и методам родительских типов в рамках описания любых дочерних типов выполняется так, как будто бы они описаны в самом дочернем типе.
Правило 3: В дочерних типах могут использоваться идентификаторы полей, и свойств совпадающие с идентификаторами полей или свойств какого-либо из родительских типов. Однако перекрытое (одноименное) поле или свойство не доступны в потомке. Идентификаторы методов в дочерних типах также могут совпадать с именами методов в родительских типах. В этом случае говорят, что дочерний метод подавляет или перекрывает одноименный ему родительский, и в рамках дочернего типа, при указании имени такого метода, будет вызываться именно дочерний метод, а не родительский. Если метод объявлен как статический, то он может иметь другие параметры, если же он объявлен как абстрактный, виртуальный или динамический, то параметры должны совпадать.
Однако возможность обращения к подавленному родительскому методу остается с помощью ключевого слова Inherited (унаследованный).
Правило 4: Дочерний тип может доопределить произвольное число собственных методов, полей и свойств.
Правило 5: Любое изменение текста в родительском методе автоматически оказывает влияние на все методы порожденных дочерних типов, которые его вызывают.
Важным аспектом, касающимся наследования, является механизм поиска метода в иерархии классов:
В первую очередь компилятор устанавливает тип объекта;
Он ищет метод в классе объекта и если находит, то подключает его;
Если метод в классе объекта не найден, то идет поиск в классе-родителе. В случае успеха вызывает метод родителя;
Если метод в классе-родителе не найден, то поиск продолжается в классах-предках до тех пор, пока вызванный метод не будет найден. Если компилятор не обнаруживает метод, то он фиксирует ошибку компиляции.\
Если этот наследуемый родительский метод вызывает еще и другие методы, то вызываться уже будут только родительские или вышележащие методы, так как вызовы методов из нижележащих по иерархии типов не допускают.
