Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Виртуалды Әдістер мен полиморфизм
Алдың ғ ы программадағ ы Move ә дісіне оралайық. Оның сипаттамасы тө мендегідей. Procedure Dot.Move; Begin Hide; a: =a+Da; b: =b+Db; Show End; Осы жерден Move ә дісінің Hide жә не Show ә дістеріне қ атынас жасайтынын кө реміз. Егер Move ә дісін осы тү рде dot жә не ring2 объектісі бар программада қ олдансақ не болады? Бұ л жағ дайда нү кте ү шін ешқ андай қ иындық туындамайды. Себебі, нү кте dot объектісінің «туғ ан» объектісі болғ андық тан, нү кте еш қ иындық сыз ө шіп, координатасын ауыстырып, қ айта жаң арады. Ал шең берге келетін болсақ, Ring.Move объектілік жү йе, алдымен Ring объектілік типінің сипаттамасынан осындай ә дісті іздейді, таба алмағ аннан кейін іздеуді ата-баба объектісінде жалғ астырады. Нә тижесінде Dot.Move ә дісіне қ атынас жасалады. Осыдан кейін Move ә дісінен Ring.Hide жә не Ring.Show ә дістері шақ ырылу керек, бірақ бұ л орындалмайды: Ring1 нысан экземпляры мұ рағ а алынғ ан Dot.Move ә дісіне Ring.Hide жә не Ring.Show ә дістерінің орнына Dot нысанының ә дістерін шақ ырады. Мұ ның себебі Dot.Hide, Dot.Show қ атаң байланысқ ан, себебі олар Dot объектілік типінің бірдей контексінде компиляцияланғ ан. Басқ а сө збен айтқ анда, бұ л ә дістер арасындағ ы байланыс статикалық сипатқ а ие. Бұ л жағ дайда щең бер емес, нү кте орын ауыстырады. Hide жә не Show ә дістері қ ай объект экземплярының Move ә дісіне қ атынас жасауына байланысты шақ ырылу ү шін не істеу керек? Бұ л жерде статикалық байланысудан ерекшеленетін динамикалық байланысу деп аталатын механизм кө меккке келеді. Бұ л механизм виртуалды ә дістердің кө мегімен жү зеге асады. Нысандық типтердің сипаттамасында виртуалды ә дістердің тақ ырыбы VIRTUAL резервтелген сө зімен толық тырылады. Егер нысандық типтің ұ рпақ тарында қ айта анық талғ ан ә дістер бар болса, олар да виртуалды ретінде жариялануы қ ажет жә не де ата-баба объектісінің ә дістері сияқ ты формальді параметр жиынтығ ына ие болуы қ ажет. Виртуалды ә дістері бар Dot жә не Ring нысандық типтердің сипаттамасы тө мендегідей: Dot = 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;
Мұ ндағ ы Constructor - процедурасының ерекше тү рін бейнелейтін резервтелген сө з. Енді Move ә дісіндегі Ring1 нысан экземплярын шақ ыруғ а, ал одан Hide жә не Show ә дістерін шақ ыруғ а оралайық. Мұ нда жү йе алдымен Dot.Move ә дісіне қ атынас жасайды, мұ ндай атаулы ә діс алдымен Ring нысанынан ізделінеді де, таба алмағ аннан кейін сә йкес ата-баба нысанының ә дісіне қ атынас жасайды. Осыдан кейін шең бердің орнын ауыстыру ү шін алдымен оны кө рінбейтіндей ету қ ажет (Ring.Hide ә дісін шақ ыру).Содан кейін оның центрінің координатасын ө згертіп, шең берді экрандағ ы жаң а орында бейнелеу қ ажет (Ring.Show ә дісін шақ ыру). ТР программасын орындау кезінде Dot.Move ә дісіне шақ ырылатын объект ү шін анық талғ ан ә діске қ атынас жасау қ амтамасыз етіледі. Бұ л жерде Ring.Show жә не Ring.Hide ә дістеріне қ атынас жасалады. Қ орытындысында сә йкес пернелердің кө мегімен жылжытуғ а болатын экрандағ ы нү кте мен шең берді бейнелейтін программаның толық мә тінін кө рсетейік: Program ObjDotСirc; Uses crt, graph; Type Dot=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=integer); procedure Show; virtual; procedure Hide; virtual; end; {----------------------------------} Constructor Dot.Init; Begin a: =x; b: =y; end; {----------------------------------} Procedure Dot.Show; Begin PutPixel(a, b: White); End; {---------------------------------} Procedure Dot.Hide; Begin PutPixel(a, b: Black); End; {---------------------------------} Procedure Dot.Move; Begin Hide; a: =a+Da; b: =b+Db; Show; End; {----------------------------------} Constructor Ring.Init; Begin a: =x; b: =y; Rad: =r; End; {----------------------------------} Procedure Ring.Show; Begin SetColor(white); Circle(a, b, Rad); End; {----------------------------------} Procedure Ring.Hide; 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 (GetMaxX div 2, GetMaxY div 2); Dot.Show; Ring1.Init (GetMaxX div 2, GetMaxY div 2, GetMaxY div 6); Ring.Show; While KeyPressed do a: =ReadKey; Repeat begin 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.
Бұ л программаның алдың ғ ы мысалдардан айырмашылығ ы – мұ нда қ осымша ұ рпақ -тип Ring жарияланғ ан жә не Show жә не Hide ә дістері 2 нысан да виртуалды жарияланғ ан. Ал Init ә дісі конструкторғ а тү рлендірілген. Сол сияқ ты Case операторы жаң а варианттармен толық тырылды. Кө рсетілген варианттар шең бердің экранда 4 бағ ытта жылжуын қ амтамасыз етеді: < PgUp> (жоғ ары), PgDown> (тө мен), < End> (оң ғ а), < Home> (солғ а) пернелерін басу кезінде генереацияланатын 73, 81, 79, 71 ScanCod-тары жылжуды жү зеге асырады. Бұ л программада Case операторының денесіндегі Move ә дісін шақ ыруғ а ерекше кө ң іл бө лу қ ажет. Бірнші тө рт жағ дайда (72, 80, 77, 75) Dot1.Move ә дісіне қ атынас жасауғ а арналғ ан, ал қ алғ анында Ring1.Move ә дісіне қ атынас жасалғ ан. Дегенмен Move ә дісінің жалғ ыз екенін білеміз, ол Dot объектісінде жарияланып, Ring нысанына мұ рағ а қ алғ ан. Басқ а сө збен айтқ анда, 1 ғ ана Move ә дісі ә ртү рлі жұ мыс істейді (нү ктені немесе шең берді жылжытады). Бұ л оны қ андай нысанның шақ ырғ анына байланысты. нысандардың мұ ндай қ асиеті полиморфизм деп аталады.
|