Программа денесі(операторлар тізбегі)


Виртуалды әдістер мен полиморфизм



бет99/163
Дата07.02.2022
өлшемі4,26 Mb.
#94523
түріПрограмма
1   ...   95   96   97   98   99   100   101   102   ...   163
Байланысты:
cda6b05d-8cb5-11e3-bf6e-f6d299da70eeУММ ПР1

Виртуалды әдістер мен полиморфизм
Алдыңғы программадан Move әдісіне оралайық.Оның сипаттамасы төмендегідей.
Procedure DotMove;
Begin
Hide;
a:=a+Da; b:=b+Db;
Show;
End.

Осы жерден Move әдісінің Hide және Show әдістеріне қатынас жасайтынын көреміз.Егер Move әдісін осы түрде dot және ring2 объектісі бар программада қолдансақ не болады?


Бұл жағдайда нүкте үшін ешқандай қиындық туындамайды.Себебі,нүкте dot объектісінің «туған» объектісі болғандықтан, нүкте еш қиындықсыз өшіп, координатасын ауыстырып,қайта жаңарады.Ал шеңберге келетін болсақ, Ring.Move объектілік жүйе,алдымен Ring объектілік типінің сипаттамасынан осындай әдісті іздейді,таба алмағаннан кейін іздеуді ата-баба объектісінде жалғастырады.Нәтижесінде DotMove әдісіне қатынас жасалады.Осыдан кейін Move әдісінен Ring.Hide және Ring.Show әдістері шақырылу керек,бірақ бұл орындалмайды: Ring1 объект экземпляры мұраға алынған DotMove әдісіне RingHide және RingShow дәсітерінің орнына Dot боъектісінің дәсітерін шақырады.Мұның себебі DotHide, DotShow қатаң байланысқан,себебі олар Dot объектілік типінің бірдей контексінде компиляцияланған.Басқа сөзбен айтқанда, бұл әдістер арасындағы байланыс статистикалық сипатқа ие.Бұл жағдайда щеңбер емес, нүкте орын ауыстырады. Hide және Show әдістері қай объект экземплярының Move әдісіне қатынас жасауына байланысты шақырылу үшін не істеу керек?Бұл жерде статикалық байланысудан ерекшеленетін динамикалық байланысу деп аталатын механизм көмеккке келеді.Бұл механизм виртуалды әдістердің көмегімен жүзеге асады.Объектілік типтердің сипаттамасында виртуалды әдістердің тақырыбы VIRTUAL резервтелген сөзімен толықтырылады.Егер объектілік типтің ұрпақтарында қайта анықталған әдістер бар болса, олар да виртуалды ретінде жариялануы қажет және де ата-баба объектісінің әдістері сияқты формальді параметр жиынтығына ие болуы қажет.
Виртуалды әдістері бар Dot және Ring объектілік типтердің сипаттамасы төмендегідей:
Dote = object
a, b:integer;
Constructor Init(x,y:integer);
procedure Show:virtual;
procedure Hide: virtual;
procedure Move(Da,Db:integer);
end;
{------------------------------------}
Ring=object(Dot);
Rad:integer;
Constructor Init(x,y,r:integer );
Procedure Show: virtual;
Procedure Hide: virtual;
End;

Мұндағы конструктор процедурасының ерекше түрін бейнелейтін резервтелген сөз.Енді Move әдісіндегі Ring1 боъект экземплярын шақыруға, ал одан Hide және Show әдістерін шақыруға оралайық.Мұнда жүйе алдымен DotMove әдісіне қатынас жасайды, мұндай атаулы әдіс алдымен Ring объектісінің ізделінеді де, таба алмағаннан кейін сәйкес ата-баба объектісінің әдісіне қатынас жасайды.Осыдан кейін шеңбердің орнын ауыстыру үшін алдымен оны көрінбейтіндей ету қажет(RingHide әдісін шақыру).Содан кейін оның центрінің координатасын өзгертіп шеңберді экрандағы жаңа орында бейнелеу қажет.(RingShow әдісін шақыру).ТР программасын орындау кезінде DotMove әдісіне шақырылатын объект үшін анықталған әдіске қатынас жасау қамтамасыз етіледі.Бұл жерде RingShow және RingHide әдістеріне қатынас жасалады.Қорытындысында сәйкес пернелердің көмегімен жылжытуға болатын экрандағы нүкте мен шеңберді бейнелейтін программаның толық мәтінін көрсетейік:


Program ObjDoture;
Uses crt; graph;
Type
Dot=Object;
a,b:integer;
conctructor Init(x,y=integer);
procedure Show:virtual;
procedure Hide:virtual;
procedure Move(Da,Db:integer);
end;
{----------------------------------}
Ring=object(Dot);
Rad:integer;
conctructor Init(x,y=integer);
procedure Show:virtual;
procedure Hide:virtual;
end;
{----------------------------------}
Constructor DotInit;
Begin
a:=x; b:=y;
end;
{----------------------------------}
Procedure DotShow;
Begin
PutPixel(a,b:White);
End;
{---------------------------------}
Procedure DotMove;
Begin
Hide;
a:=a+Da; b:=b+Db;
Show;
End;
{----------------------------------}
Constructor RingInit;
Begin
a:=x; b:=y;
Rad:=r;
End;
{----------------------------------}
Procedure RingShow;
Begin
SetColor(white);
Circle(a,b,Rad);
End;
{----------------------------------}
Procedure RingHide;
Begin
SetColor(black);
Circle(a,b,Rad);
End;
{----------------------------------}
Var i,j,k,Err:integer;
a:char; Dot1:Dot; Ring1:Ring;
begin
i:=detect;
InitGraph(i,j,’ ‘);
Err:=GraphResult;
If <>grok then
Writeln(GraphErreor Msg (Err))
Else
Begin
Dot1.Init (GetMax x div 2,GetMax y div 2);
Dot.Show;
RingInit (GetMax x div 2, GetMax y div 2,GetMax y div 6);
RingShow
While KeyPressed do a:=ReadKey ;
Repeat
a:=ReadKey;
case ord(a) of
72: Dot1.Move(0,-5);
80: Dot1.Move(0,5);
77: Dot1.Move(5,0);
75: Dot1.Move(-5,0);
73: Ring1.Move(0,-5);
81: Ring1.Move(0,5);
79: Ring1.Move(5,0);
71: Ring1.Move(-5,0);
End;
End;
Until a=chr(27);
End;
End.

Бұл программаның алдыңғы мысалдардан айырмашылығы – мұнда қосымша ұрпақ – жарияланған және Show және Hide әдістері 2 объектіде де виртуалды жарияланған.Ал Init әдісі конструкторға түрлендірілген.Сол сияқты Case жаңа варианттармен толықтырылды.Көрсетілген варианттар шеңбердің экранда 4 бағытта жылжуын қамтамасыз етеді:


(жоғары),PgDown>(төмен), (оңға), (солға) пернелерін басу кезінде генереацияланатын 73,81,79,71 ScanCod-тары жылжуды жүзеге асырады.Бұл программада Case операторының денесіндегі Move әдісін шақыруға ерекше көңіл бөлу қажет.Бірнші төрт жағдайда (72,80,77,75) Dot1.Move әдісіне қатынас жасауға арналған, ал қалғанында Ring1.Move әдісіне қатынас жасалған.Дегенмен Move әдісінің жалғыз екенін білеміз, ол Dot объектісінде жарияланып, Ring объектісіне мұраға қалған. Басқа сөзбен айтқанда, 1 ғана Move әдісі әртүрлі жұмыс істейді(нүктені немесе шеңберді жылжытады).Бұл оны қандай объектінің шақырғанына байланысты.Обьъектілердің мұндай қасиеті полиморфизм деп аталады.




Достарыңызбен бөлісу:
1   ...   95   96   97   98   99   100   101   102   ...   163




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

    Басты бет