Полиморфизм — бұл әртүрлі кластарға кіретін әдістерге бірдей ат тағайындау мүмкіндігі. Полиморфизмнің концепциясы Концепция полиморфизма обеспечивает в случае применения метода к объекту использование именно того метода, который соответствует классу объекта.
Біреуі қалған екеуіне базалық класс болатындай үш класс анықталсын:
type
// базалық класс
TPerson = class
FName: String; // өрістің аты
Constructor Create(AName: String);
Function Info: String; virtual;
end;
// TPerson – нан туынды
TStud = class (TPerson)
FGr: Integer; // оқу тобының нөмірі
Constructor Create(Aname: String; Gr: Integer);
Function Info: String; override;
end;
// TPerson – нан туынды
TProf = class(TPerson)
FDep: String; // құжыраның аты
Constructor Create(AName: String; Dep: String);
Function Info: String; override;
end;
Әрбір класта Info әдісі анықталған. Базалық класта virtual директивасының көмегімен Info әдісі көрнекі болып анықталған. Әдістің көрнекі болып анықталуы еншілес класқа көрнекілік әдісті өз меншік әдісімен айырбас жасауға мүмкіндік береді. Әрбір еншілес кластың өзінің Info класы анықталған, ол аталық кластың сәйкес келетін әдісін айырбастайды (аталық кластың көрнекілік әдістерін ауыстыратын туындалған кластың әдісі, override директивасында орналастырылады).
Төменде әрбір класс үшін Info әдісінің анықталуы келтірілген.
function TPerson.Info: String;
begin
result := ' ';
end;
functicn TStud.Info: String;
begin
result := FName + ' группа ' + IntToStr(FGr)
end;
function TProf.Info: String;
begin
result := FName + ' кафедра ' + FDep;
end;
Екі класс та бір базалық кластан туындағандықтан студенттер мен оқытушылардың тізімін былай жариялауға болады (бұл жерде мынаны еске алу қажет, объект дегеніміз - бұл нұсқағыш):
list: array[1..SZL] of TPerson;
Тізімді осылай жариялауға болады, өйткені Object Pascal аталық кластың нұсқағышына еншілес кластың нұсқағышының мәнін меншіктеуге мүмкіндік береді. Сондықтан list массивінің элементі Tstud класының және TProf класының элементтері бола алады.
Студенттер мен оқытушылардың тізімін Info әдісін массив элементтеріне қолдану арқылы шығаруға болады. Мысалы, былай:
st := ' ';
for i := 1 to SZL do // SZL – тізім – массивінің өлшемі
if list[i] <> NIL
then st := st + list[i] .Info + #13;
ShowMessage(st);
Бағдарламаның орындалуы барысында массивтің әрбір элементі TStud типті объектіден де, TProf типті объектіден де тұра алады. Полиморфизмнің коцепциясы объектіге объектінің типіне сай келетін әдісті қолдануды қамтамасыз етеді.
Келесі бағдарлама жоғарыда қарастырылған TPerson, TStud және TProf кластарының жариялануын қолдана отырып, студенттер мен оқытушылардың тізімін қалыптастырады және шығарады. Бағдарламаның мәтіні 2.1 листингісінде, ал қарым – қатынас терезесі сурет 2.1 келтірілген.
Сурет 2.1 «Полиморфизм» бағдарламасының қарым – қатынас терезесі
2.1 листингісі Полиморфизмнің демонстрациясы
Unit polimor_;
Interface
Uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
ТForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
GroupBox1: TGroupBox;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
Label1: TLabel;
Label2: TLabel;
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(AName: String);
Function Info: String; virtual;
end;
// Студент класы
TStud = class (TPerson)
FGr: Integer; // оқу тобының нөмірі
Constructor Create(AName: String; Gr: Integer);
Function Info: String; override;
end;
// Оқытушы класы
TProf = class(TPerson)
FDep: String; // құжыраның аты
Constructor Create(AName: String; Dep: String);
Function Info: String; override;
end;
const
SZL = 10; // тізімнің өлшемі
var
Forml: TForml
List: array[1..SZL] of TPerson; // тізім
n: Inteqer = 0 // тізімдегі адамдар саны
implementation
($R *.DFM}
constructor TPerson.Create(AName: string);
begin
FName:=AName;
end;
constructor TStud.Create(AName: string; Gr: integer);
begin
inherited Create(AName); // базалық кластың конструкторын шақыру
FGr:=Gr;
end;
constructor TProf.Create(AName: string; Dep: string);
begin
inherited Create(AName); // базалық кластың конструкторын шақыру
FDep:=Dep;
end;
function TPerson.Info: string;
begin
result:=FName;
end;
function TStud.Info: String;
begin
result := FName + ' группа ' + IntToStr(FGr)
end;
function TProf.Info: String;
begin
result := FName + ' кафедра ' + FDep;
end;
// Добавить батырмасына шерту
procedure ТForm1.Button1Click(Sender: TObject);
begin
if n < SZL then
begin
// объектіні класқа қосу
n:=n+1;
if RadioButton1.Checked
then // TStud объектісін құру
List[n]:=TStud.Create(Edit1.Text,StrToInt(Edit2.Text))
else // TProf объектісін құру
if RadioButton2.Checked then List[nl:=TРrоf.Create(Edit1.Text,Edit2.Text);
// енгізу өрісін тазалау
Edit1.Text :=' ';
Edit2.Text :=' ';
Edit1.SetFocus; // Тышқанның меңзері Фамилия өрісінде
end
else ShowMessage('Список заполнен!');
end;
procedure ТForm1.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;
ShowMessage(' Список ' + #13 + st);
end;
end.
Добавить (Button1) батырмасын басқанда іске қосылатын TForm1.Button1Click процедурасы TStud немесе TProf класының list[n] объектісін құрады. Құрылып жатқан объектінің класы RadioButton ауыстырып қосу батырмасының күйімен анықталады. Ауыстырып қосу батырмасының студент (RadioButton1) жағдайында орнатылуы TStud класын анықтайды, ал оқытушы (RadioButton2) жағдайы – TProf класын анықтайды.
Список (Button2) батырмасын басқанда іске қосылатын TForm1.Button2Click процедурасы тізімнің әрбір объектісіне (массив элементтеріне) Info әдісін қолдана отырып,барлық тізімді көрсететін жолды қалыптастырады.
Достарыңызбен бөлісу: |