ПОӘК 042-18-11 20. 84/01-2013 №1 баспа 26. 08. 2013 ж


Практикалық жұмыс №4 «Полиморфизм және көрнекілік әдістер»



бет16/22
Дата12.03.2018
өлшемі3,6 Mb.
#38774
1   ...   12   13   14   15   16   17   18   19   ...   22

Практикалық жұмыс №4 «Полиморфизм және көрнекілік әдістер»



Полиморфизм — бұл әртүрлі кластарға кіретін әдістерге бірдей ат тағайындау мүмкіндігі. Полиморфизмнің концепциясы Концепция полиморфизма обеспечивает в случае применения метода к объекту использование именно того метода, который соответствует классу объекта.

Біреуі қалған екеуіне базалық класс болатындай үш класс анықталсын:



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 листингісі Полиморфизмнің демонстрациясы



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 әдісін қолдана отырып,барлық тізімді көрсететін жолды қалыптастырады.


Достарыңызбен бөлісу:
1   ...   12   13   14   15   16   17   18   19   ...   22




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет