Задача с использованием полиморфизма
Полиморфизм – это возможность использовать одинаковые имена для методов, входящих в различные классы. Концепция полиморфизма обеспечивает в случае применения метода к объекту использование именно того метода, который соответствует классу объекта.
Пусть определены 3 класса, один из которых является базовым для двух других:
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;
В каждом из этих классов определен метод info. В базовом классе при помощи директивы virtual метод info объявлен виртуальным. Это дает возможность классу–потомку произвести замену виртуального метода своим собственным. В каждом классе–потомке определен свой метод info, который замещает соответствующий метод родительского класса и отмечается директивой override.
Определим метод info для каждого класса индивидуально:
function Tperson.info:string;
begin
result:=’’;
end;
function Tstud.info:string;
begin
result:=fname+' gruppa '+inttostr(fgr);
end;
function Tprof.info:string;
begin
result:=fname+' department '+fdep;
end;
Далее в программе список всех людей можно представить массивом объектов класса Tperson. Отметим, что объект – указатель.
Список людей имеет вид:
list: array[1..szl] of Tperson; { szl –размер списка}
Объявить подобным образом список можно потому, что OP позволяет присвоить указателю на родительский класс значение указателя на класс– потомок. Поэтому элементами массива list могут быть как объекты класса Tstud, так и объекты класса Tprof.
Вывод списка можно осуществить применением метода info к элементам массива, например:
St:= ’’;
for i:=1 to szl do
if list[i]<>nil then
St:=St+list[i].info+#13;
ShowMessage('Spisok:'+#13+St); { вывод в окно сообщения}
Во время работы программы каждый элемент массива может содержать как объект типа Tstud, так и объект типа Tprof.
Концепция полиморфизма обеспечивает применение к объекту именно того метода info, который соответствует типу объекта.
Напишем программу, которая использует объявления классов Tperson, Tstud, Tprof, формирует список студентов и преподавателей и выводит полученный список в окно сообщения. Будем использовать визуальное программирование.
Окно формы будет иметь вид:
GroupBox1—это компонент , объединяющий группу компонентов, связанных по смыслу. В данном случае он включает 2 зависимых переключателя – RadioButton1 и RadioButton2
Текст модуля кода программы:
unit Polimorfizm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
Type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
Edit2: TEdit;
GroupBox1: TGroupBox;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
Button1: TButton;
Button2: TButton;
procedure Button1Click(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;
Сonst szl=10;
Var
Form1: TForm1;
list:array[1..szl] of Tperson;
n:integer;
implementation {исполняемая часть}
{$R *.DFM}
constructor Tperson.Сreate(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+' gruppa '+inttostr(fgr);
end;
function Tprof.info:string;
begin
result:=fname+' department '+fdep;
end;
procedure TForm1.Button1Click(Sender: TObject);
//процедура обработки нажатия на кнопку «Добавить»
begin
if n<szl
then
begin
if RadioButton1.Checked
then
list[n]:=Tstud.Create(Edit1.text, StrtoInt(Edit2.text))
else
list[n]:=Tprof.Create(Edit1.text, Edit2.text);
n:=n+1;
end
else
ShowMessage('Spisok zapolnen');
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+#13;
// list[i].info вызовет тот метод info, которому соответствует элемент
ShowMessage('Spisok:'+#13+St);
end;
end.
Процедура TForm1.Button1Click, которая запускается нажатием кнопки «Добавить» создает объект list[n] класса либо Tstud, либо Tprof.
Класс создаваемого объекта определяется состоянием переключателя RadioButton. Установка переключателя в положение Студент определяет класс Tstud, а в положение – Преподаватель определяет класс Tprof. Процедура TForm1.Button2Click, которая запускается нажатием кнопки Список (Button2) применяет метод info к каждому элементу массива list[i] как к объекту списка и формирует строку, представляющую весь итоговый список.
Виртуальность метода info обеспечивает применение к объекту именно того метода info, который соответствует типу объекта.
Отметим, что в данной программе результаты выводятся в окно сообщения процедурой ShowMessage. Например:
Showmessage('Spisok:'+#13+st);
Showmessage('spisok zapolnen');
- Объектно-ориентированный анализ
- Объектно-ориентированное программирование.
- Объектно-ориентированное проектирование.
- Основные понятия объектно-ориентированного проектирования.
- Классы и объекты в Object Pascal.
- Важнейшие принципы объектно-ориентированного программирования.
- Составляющие класса.
- Объекты
- Создание и уничтожение объектов.
- Наследование конструкторов и деструкторов.
- Свойства и инкапсуляция.
- Статические методы.
- Полиморфизм. Виртуальные и динамические методы.
- Абстрактные методы.
- Перекрытие виртуальных и динамических методов.
- Как устроен объект изнутри
- Перезагрузка методов.
- Задача с использованием полиморфизма
- Области видимости.
- Создание класса комплексных чисел.
- Создание класса векторов
- Объект-список
- Модуль по работе со списками
- Основная программа по работе с объектами-списками
- Система программирования Delphi
- Терминология Delphi.
- Первые шаги визуального программирования в среде Delphi.
- Иерархия компонентов.
- Собственники компонентов
- Элементы управления.
- Компоненты (tComponent)
- Оконные не оконные
- Родительские и дочерние компоненты.
- Объектно-событийное программирование. События
- Реакции на события
- Программирование реакции на событие
- Особенности реализации событий
- Делегирование событий
- Виды событий
- Диалоги. Работа с файлами. Открытие и закрытие файлов с использованием стандартных диалоговых окон.
- TOpenDialog и tSaveDialog – диалоги открытия и сохранения файлов (страница dialogs )
- Компонент класса tform
- Создание и использование форм
- Шаблоны форм
- Программы со многими формами
- Модульный принцип построения программ.
- Программные файлы. Основные типы файлов проекта. Простейшее приложение.
- Структура головного файла проекта.