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

Вопрос

Примечание

Type

Вопрос

Соотношение основных понятий ООП

 

Рисунок 2 – Соотношение основных понятий ООП

 

 

В объектно-ориентированном программировании используется следующий формат записи работы с объектами:

ОБЪЕКТ.МЕТОД

ОБЪЕКТ.СВОЙСТВО.МЕТОД


 

Принципы объектно-ориентированного программирования. Понятие инкапсуляции, наследования и полиморфизма. Привести примеры программного описания.

 

Принципы, составляющие суть объектно-ориентированного программирования:

1) Инкапсуляция (encapsulation). Свойство классов объединять данные и методы обработки данных, а также скрывать внутреннюю программную реализацию самого класса.

2) Наследование (inheritance) - это возможность определения нового класса объектов как расширения уже существующего посредством сохранения полей и методов предка и описания лишь новых полей и методов.

3) Полиморфизм (polymorphism) - возможность существования в разных классах одинаково названных методов, но выполняющих различные функции.

Инкапсуляция – это важнейший принцип объектно-ориентированного подхода. Означает сочетание структур данных с методами их обработки в абстрактных типах данных – классах объектов, т.е. термин «инкапсуляция» означает замыкание в общей оболочке Object…end всех составляющих описаний.

Пример «замыкания» в общей оболочке:

TForm1 = class(TForm)

Button1: TButton;

Label1: TLabel;

Edit1: TEdit;

ImageList1: TImageList;

procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);

private

{ Private declarations }

public

{ Public declarations }

end;

 

Наследование означает, что если нужно создать новый класс, лишь немного отличающийся от старого, то совершенно нет необходимости в переписывании заново уже существующих полей и методов. Можно объявить, что новый класс TNewObject

TNewObject = class(TOldObject);

является потомком или дочерним классом старого класса TOldObject, называемого предком или родительским классом, и добавить к нему новые поля, методы и свойства — иными словами, то, что нужно при переходе от общего к частному.

Примером, иллюстрирующим наследование, является иерархия классов VCL.

В Object Pascal все классы являются потомками класса TObject. Поэтому, если нужно создать дочерний класс прямо от TObject, то в определении его можно не упоминать. Следующие два выражения одинаково верны:

TMyObject = class(TObject); TMyObject = class;

 

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

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

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

 

tуре

 

// базовый класс

 

TPerson = class

fname: string; // имя

constructor Create(name:string);

function info: string; virtual;

end;

 

// производный от TPerson TStud = class(TPerson)

fgr:integer; // номер учебной труппы

constructor Create(name:string;gr:integer);

function info: string; override; end;

 

// производный от TPerson TProf = class(TPerson)

fdep:string; // название кафедры

constructor Create(name:string;dep:string);

function info: string; override; end;

 

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

function TPerson.info:string;

begin

result := '';

end;

 

function TStud.info:string;

begin

result := fname + ' гp.' + IntTostr(fgr);

end;

 

function TProf.info:string;

begin

result := fname + ' каф.' + fdep;

end

Во время работы программы каждый элемент массива может содержать как объект типа Tstud, так и объект типа TProf. Концепция полиморфизма обеспечивает применение к объекту именно того метода, который соответствует типу объекта.

 

 

Механизм наследования. Правила наследования. Привести пример программного описания родительского и дочернего класса.

 

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

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

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

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

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

 

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

 

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

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

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

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

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

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

6) В противоположность информационным полям (см. правило 3)
идентификатор методов в дочерних типах может совпадать с именами методов в родительских типах. В этом случае говорят, что дочерние методы подавляет одноименный ему родительский, и в рамках дочернего типа, при указании имени такого метода, будет вызываться именно дочерний метод, а не родительский.

Структура описания класса-потомка:

Туре<имя класса-потомка>=Object(<имя класса-родителя>)

<новые поля класса-потомка>

<новые методы класса-потомка>

End;

Туре<имя класса-потомка>=Class(<имя класса-родителя>)

<новые поля класса-потомка>

<новые методы класса-потомка>

End;

tуре

// базовый класс

TAnimal = class

name: string[30]; // имя животного

Procedure Feed; // метод прием пищи

End;

 

//Производный класс

TMammal = class(TAnimal)

pregnancy: real; // срок вынашивания детеныша

Procedure FeedMilk; // метод приема молока

End;

 

TTiger = class (TMammal)

koldet: integer;

Procedure Hunt;

End;