Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вопросы к ИГЭ ООП.docx
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
254.41 Кб
Скачать
  1. Простое и множественное наследование. Правила наследования. Привести пример простого наследования.

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

Если непосредственный родитель единственный, то наследование называется простым, а если таких классов несколько - то множественным.

При этом класс родитель (или классы родители) и класс потомок образуют иерархию.

При множественном наследовании наследуются поля и методы всех родителей. В том случае, если среди родителей есть классы, принадлежащие одной иерархии, происходит дублирование полей и методов, наследуемых от общих родителей. На рисунке 9 представлена иерархия классов при различных видах наследования.

Рисунок 9 – Иерархия классов при различных видах наследования

Любой класс можно объявить потомком ранее описанного класса. Потомок наследует все данные и методы класса родителя и дополняет их своими данными и методами. В результате использования механизма наследование отпадает необходимость заново описывать существующие в классе-родителе поля и методы. Требуется описать только те поля и методы, которых недостает в классе-родителе.

Поиск метода в иерархии классов выполняется следующим образом:

  1. В первую очередь компилятор устанавливает тип объекта;

  2. Далее он ищет метод в классе объекта и если находит, то подключает его;

  3. Если метод в классе объекта не найден, то идет поиск в классе-родителе. В случае успеха вызывается метод родителя;

  4. Если метод в классе-родителе не найден, то поиск продолжается в классах-предках до тех пор, пока вызванный метод не будет найден.

Правила наследования

Наследования дочерними типами информационных полей и методов их родительских типов выполняются согласно следующим правилам

  1. Информационные поля и методы родительского типа наследуются всеми его дочерними типами независимо от числа промежуточных уровней иерархии

  2. Доступ к полям и методам родительских типов в рамках описания любых дочерних типов выполняются так, как будто они описаны в самом дочернем типе.

  3. Ни в одном из дочерних типов не могут использоваться идентификаторы полей совпадающих с идентификатором полей каких-либо из родительских типов. Это же относится и к идентификаторам формальных параметров, указанных в заголовке метода.

  4. Дочерние типы могут доопределить произвольное число собственных методов и информационных полей.

  5. Любое изменение текста в родительском методе автоматически оказывает влияние на все методы порожденных дочерних типов, которые его вызывают.

  6. В противоположность информационным полям (см. правило 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) может иметь любое число непосредственных дочерних типов, но в то же время только одного непосредственного родителя.