Дәріс - 1. Нысанды-бағдарланған программалаудың негізгі принциптері


Қарастырылатын сұрақтар:

-        Нысанды-бағдарланған программалау ұғымы;

-        Инкапсуляция;

-        Мұрагерлеу;

-        Полиморфизм;

-       Конструкторлар, динамикалық обьектілер және деструкторлар.

Нысанды бағдарланған программалау – программалаудың құрылымдық программалаумен салыстырғанда, әлдеқайда жетілдірілген түрі. Программалау ғылымының дамуының белгілі кезеңінде күрделі есептің шешімін жеңілдету үшін оны қарапайым ішкі есептерге бөлу туралы ұғым қалыптасты. Мәселе программаның көп операторлардан емес, салыстырмалы түрде  алғанда өз бетінше бөліктер жиынтығынан тұруында болды. Ішкі программалар программисттерді қарапайым есептердің мазмұнына терең үңілуден құтқарды, яғни ішкі программа жасалынғаннан кейін оның қалай құрылғанын білмей–ақ, оны қолдана беруге болады. Белгілі бір процедураның, функцияның қандай қызмет атқаратынын білу жеткілікті. Соңынан құрылымдық программалау одан әрі дамыды, яғни модульдер концепциясы дүниеге келді. Модуль – Turbo Pascal-дің тұрақтылар, мәліметтер типі, айнымалылар, сол сияқты процедуралар мен функциялар сипатталатын компиляцияланатын файлдары.

НБП – бұл программалаудың ескі әдстемесінің табиғи эволюциясының нәтижесі болып табылады. Ішкі программалар программистке қарапайым есептердің мазмұнына енбей-ақ қолдануға болатыны сияқты объектілер  мен де, олардың қалай ұйымдастырылғанын білмей-ақ жұмыс істеуге мүмкіндік берді.

Ескерту! НБП қарапайым есептеулерді орындайтын программалар үшін арналмаған. Мұндай жағдайда НБП тәсілдерін қолдансақ, программа тілдік конструкциялармен артық жүктеледі.

НБП негізінде 3 негізгі принцип жатыр. Олар: инкапсуляция, мұрагерлеу(наследование) және полиморфизм.

ИНКАПСУЛЯЦИЯ

Нысанды сипаттау барлық басқа типтер сияқты сипаттау бөлімінде болу қажет. Нысан  қамтитын мәліметтер нысан өрістері деп аталады. Қарапайым нысандық типтің сипаттамасы жазбалар сипаттамасына өте ұқсас, тек  record резервтелген сөзінің орнына object сөзі қолданылады.

Type

Dot = object

      a, b:integer;

end;

Бұл 2 өрістен тұратын нысандық тип, ол экранда a,b кординаталары бар нүкте болып табылады. Өріс түрінде берілген мәліметтерден басқа нысан осы өрістерге мүмкін әрекеттерді сипаттайтын ішкі программмалардан тұруы мүмкін. Мұндай ішкі программалар әдістер деп аталады. Әдіс нысан өрістеріне қатынас жасай отырып, оған параметр ретінде берілуді қажет етпейді. Өзінде тек қана өрістерді ғана емес, сонымен қатар осы өрістерге мүмкін әрекеттердің сипаттамасын қамтитын нысанның қасиетін инкапсуляция деп атайды. Мұнда нысанның сипатталуында тек ішкі программаның тақырыптары болады, ал әрбір ішкі программаның денесі жеке көрсетіледі. Алдыңғы мысалдағы Dot типін қажетті әдістермен толықтырайық.

Type

Dot = object

a, b:integer;

procedure Init(x,y:integer);

procedure Show;

procedure Hide;

procedure Move(Da, Db:integer);

end;

{- - - - - - - - - - - - -}

Procedure 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.

Бұл мысалда нысан 4 әдістен тұрады. Init әдісі объектіні инициализациялайды, яғни нүктеге бастапқы мән береді. Show және Hide  әдістері экрандағы нүктені «жандырады» және «сөндіреді». Move әдісі экрандағы нүктенің орнын ауыстырады. Нысандық тип жарияланғаннан кейін осы типтік айнымалыларды жасауға болады немесе НБП терминологиясы бойынша нысан экземплярын жасаймыз. Олар айнымалыларды сипаттау бөлімінде жарияланатын статикалық айнымалылар,  New стандартты процедура арқылы жасалған динамикалық айнымалылар болуы мүмкін.

Var

Dot1: Dot;

Мұнда Dot типіне жататын Dot1 айнымалысы жарияланған. Нысан экземпляры жасалынғаннан кейін оның өрістерінен әдістерге қатынас жасай аламыз. Нысан өрісіне қандай-да бір стандартты ішкі программаны қолдану үшін оның құрылымдық атауын қолдану жеткілікті – нысан идентификаторы мен нүкте арқылы ажыратылған өріс идентификаторын көрсету.

НБП-да нысан өрістерімен жұмыс істеу кезінде тек оның әдістері қолданылады.

Dot1.Init(100,100);

Dot1.Show;

Dot1.Move(50,50);

Жазбаларға қолданылатын сияқты, объектілерге де with операторын қолдануға болады.

With Dot1 do  begin

Init (100,100);

Show;

Move (50,50);

End.

Жоғарыда көрсетілген операторлар тізбегі бірдей. Төменде жоғарыда қарастырылған мысалдардың толық программасы көрсетілген. Бұл программа экранда нүктені бейнелейді және де бейнеленген нүктені бағдарша-пернелердің  көмегімен 4 бағытта жылжытуға болады.

Program ObjDot;

Uses crt,  graph;

Type

Dot=object

a,b:integer;

procedure Init(x,y:integer);

procedure Show;

procedure Hide;

procedure Move(Da, Db:integer);

end;

{-------------------------------------}

Procedure 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;

{--------------------------------------}

Var

i,j,k,Err:integer;

a:char;

Dot1:Dot;

{-------------------------------------}

Begin

i:=detect;

InitGraph(i,j,’  ‘);

Err:=GraphResult;

If Err<>grOK    then

Writeln(GraphErrorMsg(Err))

Else   

 

begin

Dot1.Init(GetMaxX div 2, GetMaxY div 2);

Dot1.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)

End

End;

Until a=chr(27)

End

End.

Программада Dot нысаны жарияланды. Оның 2 өрісі, 4 әдісі бар. Ары қарай Dot1 нысан экземпляры басқа айнымалылар сияқты жарияланды. Программа денесі графикалық режимге өтуді жүзеге асыратын оператордан басталады. Содан кейін  Repeat операторы белгілі пернені басуды анықтайды.Case операторы 4 нұсқаудан тұрады, олар 4 бағдарша пернелеріне сәйкес келеді. Нұсқалардың әрбіреуі нақты параметрлері бар Move әдісін шақырады, бұл әдіс нүктені қажетті бағытта 5 пиксельге жылжытады. Repeat операторы арқылы ұйымдастырылған циклдың тоқтау шарты 27 Scan кодын беретін    пернесінің басылуы болып табылады.

МҰРАГЕРЛЕУ

Айталық, нүкте объектісінен басқа шеңбер объектісі қатысатын программа құрайық. Әрине бұл жаңа типтің сипатталуын Dot типі сияқты басынан бастауға болады. Дегенмен, бұл жаңа шеңбер – типтің Dot типімен ортақ өрістері және әдістері бар. Яғни, шеңбер де нүкте сияқты оның центрін анықтайтын a,b координатасымен сипатталады. Дегенмен, құрылатын нысанға шеңбердің радиусын беретін өріс қосу керек. Ал әдістерге келетін болсақ, жаңа Ring типіне Move әдісі қолданылады, нүктенің орнын ауыстыруы мен  экранда шеңбердің ауысуы бірдей жүзеге асады. Ал Init, Show және Hide әдістерін жаңадан жасауға тура келеді. Сонымен, жаңа Ring типі  Dot типінің кейбір әдістерін қайталайды. Ендеше бар типтің негізінде оған жаңа өрістер мен әдістерді қоса отырып, жаңа тип жасауға бола ма? Бұл мұрагерлеу деп аталатын объектілік типтердің қасиеттерінің арқасында жүзеге асады. Мәселе мұрагерлеу туралы болғандықтан генеологиялық терминологияға сәйкес жаңа нысанды жасауға негіз болатын бар типті ата-бабасы  немесе ата-аналық тип деп атайды. Ал құрылатын объектіні ұрпағы деп атайды. Ұрпақ автоматты түрде өзінің ата-бабасының барлық өрістері мен әдістерін мұраға алады. Мұрагерлеу қасиеті НБП-да қолданылады. Оның арқасында бар нысанның негізінде көптеген жаңа нысандар құруға болады. Осы нысандарға негіздей отырып, нысандарды көптеп кұра беруге болады және де әрбір нысанның көп ұрпағы болуы мүмкін, бірақ оның ата-бабасы біреу ғана болады. Ал енді Dot және Ring типтеріне оралайық. Ұрпақ типінің сипаттауында ата-аналық типтің атауы көрсетілуі керек.

Type

Ring=object(Dot);

Rad=integer;

End;

Ring типінің сипатталуында шеңбердің радиусын анықтайтын Rad өрісі бар. Бұл өріс dot типінде болмаған және де  Ring типі өзінің ата-бабасының өрістерін мұраға алады (нүкте координаталары a,b). Егер Ring типінің сипаттамасын сәйкес әдістермен толықтырсақ, төмендегідей болады:

Ring=object(Dot);

Rad:integer;

Procedure Init(x,y,r:integer );

Procedure Show;

Procedure Hide;

End;

{------------------------}

Procedure 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;

Осы жерден ұрпақ-нысанның әдістері  ата-ана объектісінің бірдей атаулы әдістермен алмастырылатынын көруге болады. Басқа сөзбен айтқанда, егер Ring.Move әдісіне қатынас жасалса, жүйе алдымен Ring объектісінің сипаттамасында осындай атаудың бар-жоқтығын анықтайды. Егер бар болса, осы жаңа әдіс қолданылады. Егер жоқ болса, ата-бабасынан мұраға алған  әдісті қолданылады.

Ескерту! Тек әдістерді ғана қайта анықтауға болады. Ал ұрпақ-нысанындағы өріс атаулары ата-анасының нысанындағы өріс атауларымен сәйкес келмеуі тиіс.

Ұрпақ объектісі жарияланғаннан кейін оның өрістерімен жұмыс істеу үшін оның экземплярын жасауға болады.

Var Ring1: Ring.

ВИРТУАЛДЫ ӘДІСТЕР МЕН ПОЛИМОРФИЗМ

Алдыңғы программадағы 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 бағытта жылжуын қамтамасыз етеді: (жоғары), PgDown>(төмен), (оңға), (солға) пернелерін басу кезінде генереацияланатын 73,81,79,71 ScanCod-тары жылжуды жүзеге асырады. Бұл программада Case операторының денесіндегі  Move әдісін шақыруға ерекше көңіл бөлу қажет. Бірнші төрт жағдайда (72,80,77,75) Dot1.Move әдісіне қатынас  жасауға арналған, ал қалғанында Ring1.Move әдісіне қатынас жасалған. Дегенмен Move әдісінің  жалғыз екенін білеміз, ол Dot объектісінде жарияланып, Ring нысанына мұраға қалған. Басқа сөзбен айтқанда, 1 ғана Move әдісі әртүрлі жұмыс істейді (нүктені немесе шеңберді жылжытады). Бұл оны қандай нысанның шақырғанына байланысты. нысандардың мұндай қасиеті полиморфизм деп аталады.

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

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

ӨРІСТЕР МЕН ӘДІСТЕР: ЖАСЫРЫН ЖӘНЕ ЖАЛПЫҚАТЫНАСТЫ ӨРІСТЕР МЕН ӘДІСТЕР

Объектілік типтің сипатталуындағы өрістер мен әдістер жасырын және жалпықатынасты болып жарияланады. Объект сипатталуындағы сәйкес бөлімдер 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 директивасынан кейін жарияланған объект өрістері мен әдістері осы программаның  немесе модульдің алдында ғана қатынас жасалады. Дегенмен, егер бұл объект программаға қосылған модульде болса, жасырын өрістер мен әдістер идентификаторы программистке көрінбейді. Және де мұнда объектінің өзі қолдануға толық ашық болады. Мысалы, бұл егер коммерциялық қолданба болса, онда оны құрастырушылар  бұл қолданбаны жүзеге асыру туралы мәліметтерді жасырады. Сол сияқты программист байқаусызда өзгеріс енгізбес үшін объектінің өрістері мен әдістеріне қатынасты шектеу дұрыс болады.


Ұқсас жұмыстар

Нысанды-бағдарланған программалаудың негізгі принциптері
ЭЕМ-нің қызметі,құрамы және жіктелуі
Нысанды-бағдарланған программалаудың негізгі принциптері: инкапсуляция, мұрагерлеу, полиморфизм
Дельфи ортасында тізімдермен жұмыс істейтін компоненттер
Delphi бағдарламалау жүйесі
Тізімді өңдеу операторлары
Жаратылыстану-математикалық бағытта бейіндік оқытудың әдістемелік ерекшеліктері
Delphi ортасынның графикалық мүмкіндіктерін сипаттайтын программа
Полиморфизм - бір иерархиядағы объектілер үшін бір атаумен берілген әдістерді қолдану мүмкіндігі
Функционалдық программалау тілдерінің мүмкіндіктерді талдау