- •Вопросы к итоговому государственному междисциплинарному экзамену по дисциплине «Объектно-ориентированное программирование»
- •Объектно-ориентированное программирование как методология разработки программ. Структура объектно-ориентированной программы. Привести пример описания объектного типа.
- •Соотношение основных понятий ооп. Привести примеры программного обращения или описания основных понятий ооп.
- •Принципы объектно-ориентированного программирования. Понятие инкапсуляции, наследования и полиморфизма. Привести примеры программного описания.
- •2 Основные характеристические свойства понятий
- •Простое и множественное наследование. Правила наследования. Привести пример простого наследования.
- •Скрытие данных в объектном типе. Назначение директив private и public. Привести пример управления доступом к элементам класса.
- •Понятие виртуального метода. Назначение и отличие виртуальных и динамических методов. Правила вызова виртуальных методов. Привести пример объявления виртуального метода.
- •Выделение памяти под экземпляр объекта. Привести пример объявления и реализации конструктора и деструктора.
- •Исключительные ситуации в терминологии ооп. Глобальная и локальная обработка исключений. Привести пример использования операторов контроля исключительных ситуаций при локальной обработке.
- •Понятие проекта Delphi. Состав проекта Delphi. Основные файлы проекта, их характеристика. Привести примеры программного кода основных файлов проекта.
Простое и множественное наследование. Правила наследования. Привести пример простого наследования.
В ООП существует возможность конструирования новых более сложных классов из уже имеющихся посредством добавления полей и определения новых методов (принцип иерархичности). При этом исходный класс, на базе которого выполняется конструирование, часто называется родителем, а производный - потомком. Специальный механизм наследования обеспечивает классу-потомку возможность использования полей и методов одного или нескольких родительских классов.
Если непосредственный родитель единственный, то наследование называется простым, а если таких классов несколько - то множественным.
При этом класс родитель (или классы родители) и класс потомок образуют иерархию.
При множественном наследовании наследуются поля и методы всех родителей. В том случае, если среди родителей есть классы, принадлежащие одной иерархии, происходит дублирование полей и методов, наследуемых от общих родителей. На рисунке 9 представлена иерархия классов при различных видах наследования.
Рисунок 9 – Иерархия классов при различных видах наследования
Любой класс можно объявить потомком ранее описанного класса. Потомок наследует все данные и методы класса родителя и дополняет их своими данными и методами. В результате использования механизма наследование отпадает необходимость заново описывать существующие в классе-родителе поля и методы. Требуется описать только те поля и методы, которых недостает в классе-родителе.
Поиск метода в иерархии классов выполняется следующим образом:
В первую очередь компилятор устанавливает тип объекта;
Далее он ищет метод в классе объекта и если находит, то подключает его;
Если метод в классе объекта не найден, то идет поиск в классе-родителе. В случае успеха вызывается метод родителя;
Если метод в классе-родителе не найден, то поиск продолжается в классах-предках до тех пор, пока вызванный метод не будет найден.
Правила наследования
Наследования дочерними типами информационных полей и методов их родительских типов выполняются согласно следующим правилам
Информационные поля и методы родительского типа наследуются всеми его дочерними типами независимо от числа промежуточных уровней иерархии
Доступ к полям и методам родительских типов в рамках описания любых дочерних типов выполняются так, как будто они описаны в самом дочернем типе.
Ни в одном из дочерних типов не могут использоваться идентификаторы полей совпадающих с идентификатором полей каких-либо из родительских типов. Это же относится и к идентификаторам формальных параметров, указанных в заголовке метода.
Дочерние типы могут доопределить произвольное число собственных методов и информационных полей.
Любое изменение текста в родительском методе автоматически оказывает влияние на все методы порожденных дочерних типов, которые его вызывают.
В противоположность информационным полям (см. правило 3) идентификатор методов в дочерних типах может совпадать с именами методов в родительских типах. В этом случае говорят, что дочерние методы подавляет одноименный ему родительский, и в рамках дочернего типа, при указании имени такого метода, будет вызываться именно дочерний метод, а не родительский.
Правила вызова наследуемых методов:
при вызове метода компилятор сначала ищет метод, имя которого определено внутри типа объекта Например, в типе TForm1 определен метод Button1Click
если в типе объекта не определен метод с указанным в операторе вызова именем, то компилятор в поисках метода с таким именем поднимается выше к непосредственному родительскому типу.
Производные классы. Программное описание
Не менее важным является и тот факт, что объекты могут наследовать характеристики и поведение того, что называется порождающие, родительские объекты (или предки).
Объект во многом схож с записью, которая является оболочкой для объединения нескольких связанных элементов под одним именем. Предположим, нужно разработать программу вывода платежной ведомости, печатающую отчет и показывающую, сколько нужно выплатить каждому служащему за рабочий день. Запись можно организовать следующим образом:
TWorker = record
Fam: string[25];
Name: string[25];
Rate: Real;
end;
Здесь TWorker является типом записи, т.е. шаблоном, используемым компилятором для создания переменных типа запись.
На данной фирме работает несколько типов рабочих. Одни из них имеют почасовую оплату, другие - оклад, третьи - тарифную ставку и так далее. Программа должна учитывать все эти типы. Можно создать другой тип записи для каждого типа рабочего.
Для рабочего с почасовой оплатой труда можно построить следующий тип::
TWorkHour = record
Fam: string[25];
Name: string[25];
Rate: real;
Time: real;
end;
Преведенную запись можно сократить путем создания поля типа TWorker внутри типа TWorkHour:
TWorkHour = record
Man: TWorker;
Time: real;
end;
Запись для работника-почасовика должна иметь все записи, которые имеются в записи TWorker. Tип TWorkHour является дочерним типом для типа TWorker и наследует все, что принадлежит TWorker, и, кроме того, имеет кое-что новое, что делает его уникальным.
В Delphi для поддержки механизма наследования используется новая категория структуры данных, связанная с записями, но значительно более мощная. Типы данных в этой новой категории определяются с помощью нового зарезервированного слова class. Тип объекта может быть определен как полный, самостоятельный тип в манере описания записей Паскаля, но он может определяться и как потомок существующего типа объекта путем помещения порождающего (родительского) типа в скобки после зарезервированного слова class.
Пример:
type
TWorker = class
Fam: string[25];
Name: string[25];
Rate : real;
end;
TWorkHour = class(TWorker)
Time : real;
end;
Использование круглых скобок означает наследование.
Все возможные типы, наследующие тип TWorker, называются дочерними типами для данного типа, тогда как Тип объекта (в точности как подкаталог в DOS) может иметь любое число непосредственных дочерних типов, но в то же время только одного непосредственного родителя.
