Студопедия

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

КАТЕГОРИИ:

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






Конструкторлар, динамикалыҚ нысандар жӘне деструкторлар






Егер нысандық типте тым болмаса бір виртуалды ә діс болса, онда виртуалды ә діске бірінші қ атынас жасағ анғ а дейін объект экземплярына қ олданылатын конструктор деп аталатын арнайы ә діс болуы керек. Осығ ан байланысты ә детте конструктор нысанғ а қ андай-да бір бастапқ ы мә ндерді беретін ә діс ретінде кө рсетіледі. Конструктор немесе ата-баба нысанынан мұ рағ а қ алады жә не де конструктордың ө зі виртуалды ә діс бола алмайды. Нысандық типтің сипатталуында конструктордың тақ ырыбы кә дімгі ә діс тақ ырыбынан мынадай айырмашылық та болады. Ондағ ы 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.

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.01 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал