Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Конструкторлар, динамикалыҚ нысандар жӘне деструкторлар
Егер нысандық типте тым болмаса бір виртуалды ә діс болса, онда виртуалды ә діске бірінші қ атынас жасағ анғ а дейін объект экземплярына қ олданылатын конструктор деп аталатын арнайы ә діс болуы керек. Осығ ан байланысты ә детте конструктор нысанғ а қ андай-да бір бастапқ ы мә ндерді беретін ә діс ретінде кө рсетіледі. Конструктор немесе ата-баба нысанынан мұ рағ а қ алады жә не де конструктордың ө зі виртуалды ә діс бола алмайды. Нысандық типтің сипатталуында конструктордың тақ ырыбы кә дімгі ә діс тақ ырыбынан мынадай айырмашылық та болады. Ондағ ы procedure резервтелген сө здің орнына constructor сө зі қ олданылады. Кә дімгі ә дістен конструктордың қ андай айырмашылығ ы бар? Конструктор онда сипатталғ ан ә рекеттерден басқ а нысан мен виртуалды ә дістерді жү зеге асыратын код адрестері бар арнайы виртуалды ә дістер кестесінің арасында байланыс орнатады. Алдың ғ ы тақ ырыпта айтып ө ткендей, объектілік типтің экземплярлары статикалық жә не динамикалық тү рде анық тала алады. Dot1 жә не Ring1 объект экземплярларының динамикалқ тү рде қ ұ рылуы тө мендегідей болады. Var Dot1: ^Dot; Ring1: ^Ring; Begin New (Dot1, Init); New (Ring1, Init);
Жоғ арыда айтылғ андай, егер объектіде виртуалды ә дістер бар болса, оларғ а қ атынас жасамас бұ рын осы объектінің экземпляры конструкторды шақ ыруы керек. Осындай конструктор ретінде мұ нда Init ә дісі тұ р. Ол New процедурасының екінші параметрі ретінде шақ ырылып тұ р. New рпоцедурасы объектінің динамикалық экземплярын қ ұ рады. Тақ ырыбы: Procеdure New (var P: pointer [, Init: Constructor]); Мұ ндағ ы, P – типтендірілген нұ сқ ауыш; Init – объект конструкторы. Динамикалық объектімен жұ мысты аяқ тағ аннан кейін, оғ ан бө лінген жадыны босату керек. Бұ л Dispose стандартты процедура арқ ылы жү зеге асады. Dispose (Dot1, Done); Dispose (Ring1, Done); Мұ нда Dispose процедурасы Done деструкторына қ атынас жасайды. Dispose процедурасы объект орналасқ ан жадыны босатады. Тақ ырыбы: Procedure Dispose (var P: Pointer [, Done]); Мұ ндағ ы, P – типтендірілген нұ сқ ауыш; Done – объект деструкторы. Объектілік типтің сипатталуында деструктор тақ ырыбының кә дімгі ә діс тақ ырыбынан айырмашылығ ы – ондағ ы Procedure резервтелген сө зі Destructor сө зімен алмастырылады. Дегенмен конструкторғ а қ арағ анда деструктор резервтелген сө зі процедура сө зінің синонимі болып табылады. Басқ а сө збен айтқ анда, объектімен жұ мысты аяқ тайтын ә діс арнайы резервтелген сө збен безендіріледі. Жә не де конструктордан айырмашылығ ы – деструкторлар виртуалды ә діс ретінде кө рсетіле алады. Мұ нда Done деструкторын шақ ыру ө здігінен динамикалық жадыны босата алмайтынын тү сіну керек. Dot1 жә не Ring1 объектілерінің динамикалық тү рде жарияланатынын кө рсететін мысал: Porgram ObjectDotCirc1; 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); Destructor Done End; {-------------------------------------} Ring=object(Dot); Rad: integer; Constructor Init(x, y, z: integer); Procedure Show; virtual; Procedure Hide; virtual; Destructor Done 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, 0) End; {-------------------------------------} Procedure Dot.Move; Begin Hide; a: =a+Da; b: =b+Db; Show; End; {-------------------------------------} Constructor Ring.Init; Begin a: =x; b: =y; Rad: =z; end; {------------------------------------} Procedure Ring.Show; Begin SetColor(black); Circle(a, b, Rad); End; {------------------------------------} Procedure Ring.Hide; Begin SetColor(0); Circle(a, b, Rad); End; {------------------------------------} Destructor Dot.Done; Begin Hide; End; {------------------------------------} Destructor Ring.Done; Begin Hide End; {------------------------------------} Var i, j, k, Err: integer; a: char; Dot1: Dot; Ring1: Ring; Begin i: =detect; InitGraph (i, j, ’ ‘); Err: =GraphResult; if Err < > grok then writeln(Graph Error Msg(Err)) else begin New (Dot1, Init(GetMaxX div 2, GetMaxY div 2)); Dot1^.Show; New(Ring1, Init(GetMaxX div 2, GetMaxY div 2, GetMaxY div 6)); Ring1^.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); Dispose (Dot1, Done); Dispose(Ring1, Done); End End.
|