Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методичка_ООТ.doc
Скачиваний:
4
Добавлен:
28.05.2015
Размер:
126.46 Кб
Скачать

Иерархия

Абстракция – вещь полезная не всегда, кроме самых простых ситуаций, число абстракций в системе намного превышает наши умственные возможности. Инкапсуляция позволяет в какой-то степени устранить это препятствие, убрав из поля зрения внутреннее содержание абстракций. Модульность также упрощает задачу, объединяя логически связанные абстракции в группы. НО это оказывается недостаточно.

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

Иерархия – это упорядочение абстракций, расположение их по уровням.

Основными видами иерархических структур, применительно к сложным системам, являются структуры классов (иерархия «is a») и структура объектов (иерархия «part of»).

Структура объектов «partof» означает «состоит из». Примером такой иерархии может служить автомобиль, который состоит из колес, двигателя, руля и т.д. Этот вид иерархии описывает отношениеагрегации.

Важным элементом объектно-ориентированных систем и основным видом иерархии «isa» являетсянаследование.

Наследование означает такое отношение между классами (отношение родитель/потомок), когда один класс заимствует структурную или функциональную часть одного или нескольких других классов (соответственно, одиночное и множественное наследование).

Иными словами, наследование создает такую иерархию абстракций, в которой подклассы наследуют строение от одного или нескольких суперклассов. Часто подкласс достраивает или переписывает компоненты вышестоящего класса.

Схематически, наследование описывает отношение типа «is a». Например, медведь есть млекопитающее, дом есть недвижимость, ТУ-104 есть самолет.

Object Pascal поддерживает только одиночное наследование, когда подкласс создан только из одного суперкласса, потомок порожден только одним родительским классом.

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

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

В объявлении класса-потомка указывается класс родителя.

Новый класс employee (сотрудник) может быть порожден от, рассмотренного выше, класса person, путем добавления свойства facult – факультет. Объявление этого класса в этом случае может выглядеть так:

NFacult=string[9]

employee=class (person)

Ffacult: NFacult

Construction create(Name: TName; facult: TFacult)

procedure print;

end;

Поведение методов при наследовании

Унаследованные от класса-предка поля и методы доступны в дочернем класса; если имеет место совпадение имен методов, то говорят, что они перекрываются.

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

  1. Статические методы

  2. Виртуальные или динамические методы

  3. Перегружаемые методы

Мы рассмотрим 1 и 2 группы.

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

Код нового статического метода полностью перекрывает (заменяет собой) код старого метода.

Procedure person.print;

begin

writeln(‘Name’, FName, ‘Address’, FAddress);

end;

Procedure employee.print;

begin

writeln(‘Name’, FName, ‘Address’, FAddress, ‘Facult’, FFacult)

end;

Здесь приведены разные методы с одинаковыми именами. Перекрытый метод не доступен в потомке обычным образом. Нельзя просто в методе print потомка вызвать метод print предка. Это можно сделать с помощью зарезервированного слова inherited.

Например:

Constructor employee.create (Name: TName; Facult: TFacult);

begin

inherited create(Name);

Ffacult:=Facult;

end;

После создания объекта производного класса в программе можно использовать поля и методы родительского класса.

Например:

Var

VSpom: employee;

VSpom:=employee.create(‘Иванов’,’МСФ’);

VSpom.address:=’Мира 4-5’;

VSpom.print;

По умолчанию методы объектов являются статическими – их адрес определяется еще не стадии компиляции проекта, поэтому они вызываются быстрее всего.

Полиморфизм. Виртуальные методы.

Принципиально отличаются от статических виртуальные и динамические методы. Они должны быть объявлены путем добавления соответствующей директивы virtual или dynamic.

С помощью этих методов реализуется принцип, называемый полиморфизмом – наиболее важный объектно-ориентированного программирования.

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

Например:

person=class

FName: TName

Constructor create(Name: TName)

procedure print; virtual;

end;

stud=class(person)

Fgr: string[5]

Constructor create (Name: TName; gr: string[5]);

procedure print; override;

end;

prep=class(person)

Fkaf: string[10]

Constructor create (Name: TName; kaf: string[10]);

procedure print; override;

end;

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

procedure person.print;

begin

writeln(‘Name’, FName); {хотя он может быть и пустым}

end;

procedure stud.print;

begin

writeln(FName+’группа’+fgr);

end;

procedure prep.print

begin

writeln(FName+’’+fkaf);

end;

Контроль соответствия типов.

Как можно использовать этот полиморфизм. Например в программе список всех людей можно представить массивом объектов класса person

list: array[1..N] of person;

Но элементами такого массива могут быть как объекты класса stud, так и объекты класса prep. Почему это возможно? На самом деле объект – это указатель Object Pascal позволяет указателю на родительский класс присвоить значение указателя не дочерний класс. Т.е. объекту как указателю на экземпляр объектного типа может быть присвоен адрес любого экземпляра любого из дочерних классов.

Вывод списка можно осуществить применением метода print к элементам массива

For i:= 1 to N do

List[1].print

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

При разработке проектов, описывающих явления и процессы, чтобы смоделировать их средствами ООП, можно выделить их самые общие, типовые черты. Те из них, которые не изменяют своего содержания, должны быть реализованы в виде статических методов. Те же, которые изменяются при переходе от общего к частному, лучше облечь в форму виртуальных методов. Основные,»родовые» черты (методы) нужно описать в классе предке и затем перекрывать их в классах потомках.

Здесь были рассмотрены основные преимущества объектно-ориентированного подхода и его реализация в объектно-ориентированном программировании. Эти черты позволили ему стать основным способом разработки серьезного программного обеспечения.

Полный вид программного модуля приведен в приложении данного пособия.

9