Демонстрация полиморфизма
Листинг 9.1. Демонстрация полиморфизма
unit polimor_;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm) Edit1: TEdit;
Edit2: TEdit;
GroupBoxl: TGroupBox;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
Button2: TButton;
procedure ButtonlClick(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
// базовый класс
TPerson = class
fName: string; // имя
constructor Create(name:string);
function info:string; virtual;
end;
// класс Студент TStud = class(TPerson)
fGr:integer; // номер группы
constructor Create(name:string;gr:integer);
function info:string;
override;
end;
// класс Преподаватель
TProf = class (TPerson)
fdep:string; // название кафедры
constructor Create(name:string;dep:string);
function info:string;
override;
end;
const
SZL = 10; // размер списка
var
Forml: TForm1;
List: array[l..SZL] of TPerson; // список
n:integer =0; // кол-во людей в списке
implementation
{$R *.DFM}
constructor TPerson.Create(name:string);
begin
fName := name; end;
constructor TStud.Create(name:string;gr:integer);
begin
inherited create(name);
// вызвать конструктор базового класса
fGr := gr; end;
constructor TProf.create(name:string; dep:string);
begin
inherited create(name);
// вызвать конструктор базового класса
fDep := dep; end;
function TPerson.Info:string;
begin
result := fname; end;
function TStud.Info:string;
begin
result := fname + ' rp.' + IntToStr(fGr);
end;
function TProf.Info:string;
begin
result := fname + ' каф.' + fDep;
end;
// щелчок на кнопке Добавить
procedure TForml.ButtonlClick(Sender: TObject);
begin
if n < SZL then begin
// добавить объект в список
n:=n+l;
if Radiobuttonl.Checked
then // создадим объект TStud
List[n]:=TStud.Create(Edit1.Text,StrToInt(Edit2.Text))
else // создать объект TProf
List[n]:=TProf.Create(Edit1.Text,Edit2.Text);
// очистить поля ввода
Edit1.Text := '' ; Edit2.Text := '';
Edit1.SetFocus; // курсор в поле Фамилия
end
else ShowMessage('Список заполнен!');
end;
// щелчок на кнопке Список
procedure TForm1.Button2Click(Sender: TObject);
var
i:integer; // индекс
st:string; // список begin
for i:=1 to SZL do
if list[i] <>
NIL then st:=st + list[i].info + 113;
ShowMessage('Cпиcoк'+#13+st);
end;
end.
Процедура TForml.Buttoniciick, которая запускается нажатием кнопки Добавить (Buttonl), создает объект iist[n] класса TStud или TProf. Класс создаваемого объекта определяется состоянием переключателя RadioButton. Установка переключателя в положение студент (RadioButtoni) определяет класс TStud, а в положение преподаватель (RadioButton2) — класс TProf.
Процедура TForm1.Button2Сlick, которая запускается нажатием кнопки Список (Button2), применяя метод info к каждому объекту списка (элементу массива), формирует строку, представляющую собой весь список.