Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа 2012 / ВВЕДЕНИЕ В ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ.doc
Скачиваний:
45
Добавлен:
07.06.2015
Размер:
183.81 Кб
Скачать

Полиморфизм

Полиморфизм неразрывно связан с наследованием

Полиморфизм – возможность замещения методов класса-родителя одноименными методами класса-потомка.

Другими словами, - это свойство классов решать сходные по смыслу задачи разными способами.

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

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

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

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

В зависимости от того, какие действия происходят при вызове, методы делятся на следующие группы:

  • статические методы;

  • виртуальные методы;

  • динамические методы.

Пример:

Класс TEmpioyee должен иметь свой собственный конструктор, обеспечивающий инициализацию класса-родителя и своих полей. Вот пример реализации конструктора класса TEmployee:

constructor TEmpioyee.Create(Name:Tname;Dep:integer);

begin

inherited Create(Name); //inherited (англ.- унаследованный)

FDepartment:=Dep;

end;

В приведенном примере директивой inherited (англ.- унаследованный )вызывается конструктор родительского класса. После этого присваивается значение полю класса-потомка.

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

Var engineer :TEmployee;

engineer := TEmployee.Create('Сидоров',413);

engineer.address := 'ул.Блохина, д.8, кв.10';

engineer.age := 23;

if engineer.dep=413 then …

________

Пример:

type

  Person=class

    name: string;

    age: integer;

    constructor Create(nm: string; ag: integer);

    begin

      name:=nm; age:=ag;

    end;

    procedure Print;

    begin

      writeln('Имя: ',name,'  Возраст: ',age);

    end;

  end;

  Student=class(Person)

    course, group: integer; новые поля

    constructor Create(nm: string; ag,c,gr: integer);

    begin //директивой inherited (англ.- унаследованный )вызывается конструктор родительского //класса. После этого присваивается значение полю класса-потомка.

      inherited Create(nm,ag); //перекрытие метода родительского

      course:=c; group:=gr; //и добавление новых действий в методе

      name:=nm; age:=ag;

    end;

    procedure Print;

    begin

      inherited Print; //перекрытие метода родительского

      writeln('Курс: ',course,'  Группа: ',group);// и добавление новых действий в методе

    end;

  end;

Здесь метод Printпроизводного классаStudentвызывает вначале методPrint, унаследованный от базового классаPerson, с помощью конструкцииinherited Print. Аналогично конструкторCreateклассаStudentвызывает вначале конструкторCreateбазового классаPerson, также используя служебное словоinherited. Следует обратить внимание, что конструктор базового класса вызывается в этом случае как процедура, а не как функция, при этом создания нового объекта не происходит.