Полиморфизм
Полиморфизм неразрывно связан с наследованием
Полиморфизм – возможность замещения методов класса-родителя одноименными методами класса-потомка.
Другими словами, - это свойство классов решать сходные по смыслу задачи разными способами.
Изменяя алгоритм того или иного метода в потомках класса, программист может придавать этим потомкам отсутствующие у родителя специфические свойства.
Для изменения метода необходимо перекрыть его в потомке, т.е. объявить в потомке одноименный метод и реализовать в нем нужные действия.
В результате в -родителе и -потомке будут действовать два одноименных метода, имеющих разную алгоритмическую основу.
Способность использования одного и того же метода сообразно своему классу называется полиморфизмом.
В зависимости от того, какие действия происходят при вызове, методы делятся на следующие группы:
статические методы;
виртуальные методы;
динамические методы.
Пример:
Класс 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. Следует обратить внимание, что конструктор базового класса вызывается в этом случае как процедура, а не как функция, при этом создания нового объекта не происходит.