Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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






Алдың ғ ы программадағ ы 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 ә дісі ә ртү рлі жұ мыс істейді (нү ктені немесе шең берді жылжытады). Бұ л оны қ андай нысанның шақ ырғ анына байланысты. нысандардың мұ ндай қ асиеті полиморфизм деп аталады.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.