КОНСТРУКТОРЛАР, ДИНАМИКАЛЫҚ НЫСАНДАР ЖӘНЕ ДЕСТРУКТОРЛАР

Егер нысандық типте тым болмаса бір виртуалды әдіс болса, онда виртуалды әдіске бірінші қатынас жасағанға дейін объект экземплярына қолданылатын конструктор деп аталатын арнайы әдіс болуы керек.

Осыған байланысты әдетте конструктор нысанға қандай-да бір бастапқы мәндерді беретін әдіс ретінде көрсетіледі. Конструктор немесе ата-баба нысанынан мұраға қалады және де конструктордың өзі виртуалды әдіс бола алмайды. Нысандық типтің сипатталуында конструктордың тақырыбы кәдімгі әдіс тақырыбынан мынадай айырмашылықта болады.

Ондағы 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.

Загрузка...
Загрузка...
Загрузка...
Бөлісу