Полиморфизм и виртуальные методы
Полиморфизм – это возможность использовать одинаковые имена для методов, входящих в различные классы. Концепция полиморфизма обеспечивает в случае применения метода к объекту использование именно того метода, который соответствует классу объекта.
Пусть определены три класса, один из которых является базовым для двух других:
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).
Ниже приведено определение метода info для каждого класса.
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;
Так как оба класса порождены от одного и того же базового, объявить список студентов и преподавателей можно так (здесь следует вспомнить, что объект – это указатель):
list: array [l.. SZL] of TPerson;
Объявить подобным образом список можно потому, что язык Delphi позволяет указателю на родительский класс присвоить значение указателя на дочерний класс. Поэтому элементами массива list могут быть как объекты класса TStud, так и объекты класса TProf.
Вывести список студентов и преподавателей можно применением метода info к элементам массива. Например, так:
st: = ''; for i: = l to SZL do // SZL – размер массива-списка if list[i] о NIL then st: = st + list[i].Info + #13; ShowMessage (st);
Во время работы программы каждый элемент массива может содержать как объект типа xstud, так и объект типа TProf. Концепция полиморфизма обеспечивает применение к объекту именно того метода, который соответствует типу объекта.