Программа денесі(операторлар тізбегі)


-ДӘРІС. Объектілерді динамикалық құру



бет100/163
Дата07.02.2022
өлшемі4,26 Mb.
#94523
түріПрограмма
1   ...   96   97   98   99   100   101   102   103   ...   163
Байланысты:
cda6b05d-8cb5-11e3-bf6e-f6d299da70eeУММ ПР1

15-ДӘРІС. Объектілерді динамикалық құру.

  1. Конструкторлар және деструкторлар.

  2. Көрінбейтін өрістер мен әдістер.



Конструкторлар, динамикалық обьектілер және деструкторлар
Егер объектілік типте тым болмаса бір виртуалды әдіс болса, онда виртуалды әдіске бірінші қатынас жасағанға дейін объект экземплярына қолданылатын конструктор деп аталатын арнайы әдіс болуы керек.Осыған байланысты әдетте конструктор объектіге қандай да бір бастапқы мәндерді беретін әдіс ретінде көрсетіледі.Конструктор немесе ата-баба объектісінен мұраға қалады және де конструктордың өзі виртуалды әдіс бола алмайды.Объектілік типтің сипатталуында конструктордың тақырыбы кәдімгі әдіс тақырыбынан мынадай айырмашылықта болады. Ондағы 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 DotInit;
Begin
a:=x; b:=y;
end;
{-------------------------------------}
Procedure DotShow;
Begin
PutPixel(a,b,white);
{-------------------------------------}
Procedure Dot.Hide;
Begin
PutPixel(a,b,0);
End;
{-------------------------------------}
Procedure Dot.Move;
Begin
Hide;
a:=a+Da; b:=b+Db;
Show;
End;
{-------------------------------------}
Constructor RingInit;
Begin
a:=x; b:=y; Rad:=z;
end;
{------------------------------------}
Procedure RingShow;
Begin
SetColor(black);
Circle(a,b,Rad);
End;
{------------------------------------}
Procedure Ring;
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(GetMax x div 2;GetMax y div 2));
Dot1^Show;
New(Ring1.Init(GetMax x div 2;GetMax y div 2;GetMax y div 6));
Ring1^Show;
While KeyPressed do a:=ReadKey;
Repeat
Begin
A:=ReadKey;
Case ord(d) 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.

Өрістер мен әдістер.


Жасырын және жалпы қатынасты өрістер мен әдістер
Объектілік типтің сипатталуындағы өрістер мен әдістер жасырын және жалпы қатынасты болып жарияланады.Объект сипатталуындағы сәйкес бөлімдер Private немесе Public директиваларымен ашылады.Алдыңғы мысалдағы Dot типінің сипатталуында осы директивалар төмендегідей қолданылады:
Dot=object;
Private
a,b:integer;
Public
Constructor Init(x,y:intrger);
Procedure Show:virtual;
Private
Procedure Hide:virtual;
Procedure Move (Da,Db:integer);
Public
Destructor Done;
End;

Бұл мысалда жасырын өріс ретінде а және b өрістері, және Hide және Move әдістері жарияланған.Ал Init,Show,Done әдістері жалпы қатынасты болып тұр.Әрбір кезекті Private немесе Public директивалары алдыңғысының әреккетін қайтарады.Егер типтің сипатталуында бұл директивалар болмаса, онда үнсіз келісім бойынша барлық өрістер мен әдістер жалпы қатынасты болып табылады. Private директивасынан кейін жарияланған объект өрістері мен әдістері осы прогерамманың немесе модульдің алдында ғана қатынас жасалады.Дегенмен,егер бұл объект программаға қосылған мдоульбе болса, жасырын өрістер мен әдістер идентификаторы программистке көрінбейді.Және де мұнда объектінің өзі қолдануға толық ашық болады.Мысалы, бұл егер коммерциялық қолданба болса, онда оны құрастырушылар бұл қолданбаны жүзеге асыру туралы мәліметтерді жасырады.Сол сияқты программист байқаусызда өзгеріс енгізбес үшін объектінің өрістері мен әдістеріне қатынасты шектеу дұрыс болады.






Достарыңызбен бөлісу:
1   ...   96   97   98   99   100   101   102   103   ...   163




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет