Правила наследования
Вопрос
Примечание
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;