ОҚУ-Әдістемелік материалдар семей 2012. мазмұны


Рекурсия және оның сипатталуы



бет11/16
Дата09.06.2016
өлшемі7.19 Mb.
#125062
1   ...   8   9   10   11   12   13   14   15   16

Рекурсия және оның сипатталуы

Рекурсия – бұл қосалқы программаның құрамындағы операторлардың орындалуы барысында өзін-өзі шақыратын , есептеу процесін ұйымдастыру тәсілі.

Енді факториалды есептеу мысалын қарастырайық. Программа edinput компонентінен N бүтін санын алып, LBOutput компонентіне Factorial рекурсивті функциясының көмегімен N!-дің мәнін шығарады.

Дұрыс ұйымдастырылған рекурсивті қосалқы программ орындалғанда алгоритмнің қандай да бір ағымдағы деңгейдегі ұйымдастырылуынан төменгі деңгейге көшу бірнеше рет жүзеге асады, ол қойылған есептің тривиалды, шешімін алғанша тізбекті түрде жалғаса береді. Біздің жағдайда тривиалды шешім N=0 болған жағдайда алынады да, рекурсия тоқтайды.

Procedure TfmExample,bbRunClick(Sender:TObject);

Function Factorial (N:Word):Extended;

Begin


If N=0 then

Result:=N*Factorial(N-1)

End;

Var


N:integer;

Begin


Try

N:=StrToInt(Trim(Edinput.Text));

Except

Exit


End;

LBOutput.Caption:=FloatToStr(Factorial(N))

End;

Алгоритмді рекурсивті түрде ұйымдастыруда программа мәтіні өте ыңғайлы, шағын, бірақ, орындалуы баяу және стектің толық орындалуы мүмкін (қосалқы программа әрбір шақырылған сайын оның локальды парамерлері ерекше ұйымдастырылған «программалық стек» деп аталатын жады бөлігіне орналасады).



Рекурсивті шақыру жанама болуы мүмкін. Мұндай жағдайда қосалқы программа өзіне бірінші қосалқы программаны шақыру жазылған басқа қосалқы программаны шақыру арқылы оралады.

Мысалы:


Procedure A (i:Byte);

Begin


B(i);


Procedure B (j:Byte);

Begin



A (i);




Егер «әрбір пайдаланылатын идентификатор алдын-ала сипатталуы тиіс» деген ережеге сүйенсек, онда мұндай программалық құрылымды пайдалануға болмайды. Ал, мұндай сипаттау болып жатса, онда алдын-ала бейнелеу енгізіледі.

Procedure B (j:Byte); Forward;

Procedure A (i:Byte);

Begin


B(i);


End;


Procedure B;

Begin


A(j);


End;


Келтірілген мысалдан көріп отырғанымыздай, алдын-ала бейнелеуде, процедураның тақырыбы хабарланып, ал оның денесі стандартты П директивасымен алмасады. Сондай-ақ, процедура денесі тақырыбымен жазылады, бірақ бұрын сипатталған формальды параметрлер көрсетілмейді.
ТАПСЫРМА:

Object Pascal тілінде нақты санды кез келген дәрежеге шығару операциясы қарастырылмаған. Дегенмен, бұл есепті Exp және ln математикалық стандартты функцияларын пайдалана отырып шығаруға болады:





ТАПСЫРМАНЫ ОРЫНДАУҒА ӘДІСТЕМЕЛІК НҰСҚАУЛАР:

А және В екі нақты параметрлері бар, А-ны В-ға дәрежелегендегі нәтижені беретін Power деген атпен функция құрайық.

Біздің құрған fmExample оқу формасында bbRunClick оқиғасын өңдеуші edInput компонентінің мәтінді оқып, ең болмағанда бір бос орынмен бөлінген екі санды бөліп (ерекшелеп) көрсетуге тырысады. Егер осыны орындау мүмкін болса, онда ол Power функциясына екі рет оралады: алдымен бірінші x саны, екінші y санына дәреже болады; одан кейін x санына y саны дәреже болады.

Procedure TfmExample. bbRunClick(Sender:TObject);

Function Power(A, B:real):real;

{Функция А санын В санына дәрежелейді. өйткені теріс саннан логарифм алынбайды, А-ның мәнін тексеру жүзеге асырылады: теріс мән оң мәнге алмастырылады. Сонымен қатар, кез келген санның ноль дәрежесі бірге тең}

Begin

If A>0 then



Result:=Exp(B*Ln(A))

Else if A<0 then

Result:=Exp(B*Ln(Abs(A)))

Else if B=0 then

Result:=0;

End; //Power

Var

S: string; x, y:real;



Begin

{edInput компонентінен жолды оқып, одан кем дегенде бір бос орынмен бөлінген екі нақты санды бөліп аламыз}



s:=edInput.Text

if (S=’’) or (pos(‘’,S)=0) then

Exit; //Мәтін немесе бос орын болмаса, онда ары қарай жұмыс орындалмай тоқтатылады

Try //Бірінші санды бөліп аламыз:

x:=StrToFloat(copy(s, 1, pos(‘’,s)-1)); //Егер бос орынға дейінгі символдарды өшірсек, онда екінші санды бөліп аламыз.

delete(s, 1, pos(‘’,s));

y:StrToFloat(trim(s));

except


Exit; //Қате пайда болған жағдайда жұмыс тоқтатылады.

End;


MmOutput.Lines.Add(FloatToStr(Power(x,-y)));

MmOutput.Lines.Add(FloatToStr(Power(x,-y)));



end;

Бұл жерде біз Power функциясын шақыруда нақты санды FloatToStr жолына түрлендіретін стандартты функцияны шақыруда пайдаланатын параметр ретінде көрсеттік: Power функциясын шақыру кезінде х және у параметрлері – бұл шынайы параметрлер. Олар функция тақырыбындағы а және В формальды параметрлерінің орнына қойылып, одан кейін тиісті әрекеттердің орындалуы жүзеге асады. Алынған нәтиже «Result» атты арнайы айнымалыға меншіктеледі. Программада Power функциясы екі рет шақырылады: алдымен х және у праметрлерімен, сондықтан екі нәтиже алынады.



Ұсынылатын әдебиеттер: [1-9]
Бекіту сұрақтары:


  1. Object Pascal тіліндегі процедуралар мен функциялардың қызметі қандай және олар қалай сипатталады?

  2. Рекурсия дегеніміз не?

  3. Жергілікті және глобальды атаулар деп қандай атауларды айтамыз?

  4. Процедуралар мен функциялардың орналасуының қандай ерекшелігі бар?

  5. Қосалқы программаларға қолданылатын қандай стандартты директивалар бар?

  6. Формальды параметрлер дегеніміз не?

  7. Ескерілмейтін параметрлер деп қандай параметрлерді айтамыз және олар қалай сипатталады?

  8. Массив параметрлер деп қандай параметрлерді айтамыз және олар қалай сипатталады?

  9. Ашық массив дегеніміз не және ол қалай сипатталады?

  10. Ашық массивтің жоғарғы шекарасы қандай стандартты функциямен анықталады?

  11. Массив конструкторы дегеніміз не?

  12. Вариантты массивтер қандай жағдайларда пайдаланылады?

  13. GetArrayAverage функциясының қызметі қандай?

  14. Процедуралық типтердің негізгі қызметі қандай және олар қалай хабарланады?

  15. Object Pascal тілінде қанша процедуралық тип бар?

  16. Рекурсия дегеніміз не және ол қалай ұйымдастырылады?

  17. Нақты a, b және с сандары берілген. Төмендегі өрнектердің мәнін есептейтін программа жазыңдар:

  18. А) S=(max(a,a+b)+max(a,b+c))/(1+max(a+b*c,a*b+c));

  19. В) S=(max(a,b,c)+max(ab,bc,ac))/min(1/a,1/b,1/c)-max(a/b,a/c,b/c)).

  20. Есептеңіз:

  21. Z-(V1+V2+V3)/3, мұндағы V1,V2,V3 – радиустардың өлшемі сәйкес r1,r2,r3 – болып келген шар көлемдері.

  22. Нақты X1,Y1,X2,Y2…X10,Y10 сандар берілген. Төбелерінің сәйкес координаталары (X1,Y1),(X2,Y2)…(X10,Y10) болатын онбұрыштың периметрлерін табыңдар.

  23. М және n натурал сандары a1,…,an, b1,…,bm, c1…,c30 бүтін сандары берілген. Табыңыз:


  24. Динамикалық жады дегеніміз не?

  25. Көрсеткіш дегеніміз не және не үшін пайдаланылады?

  26. Типтелмеген көрсеткіштердің қызметі қандай?


Зертханалық жұмыс №12
Тақырыбы: Кластар мен интерфейстер. Модульдер
Мақсаты Delphi ортасының жұмысына жалпы сипаттама
Қолданылатын материалдар мен құрал- жабдықтар:

Компьютер, Delphi программалау ортасы
Теориялық түсініктеме:

Object Pascal тіліндегі кластар деп өрістен, әдістен және қасиеттерден тұратын арнайы типтерді айтады. Кез-келген басқа типтер тәрізді класс объект деп аталатын нақты экземплярды құру қызметін атқарады. Turbo Pascal жүйесіндегі жасалған программалармен үйлесімділікті сақтау үшін жүйені құрушылар Object Pascal тіліндегі бұрынғы объектілі модельді сүйемелдейтін Object – объект типін қалдырған. Кластың басқа типтерден басқа маңызды айырмашылығы кластың объектілері барлық уақытта топқа бөліне алады. Сондықтан объект айнымалылар жадының динамикалық бөлігінде көрсеткіштің рөлін атқарады. Дегенмен, басқа көрстекіштерден айырмашылығы объектінің мазмұнына сілтемеде объектінің атауынан кейін «^» символын пайдалануға болмайды:

Type

TmyClass=class(TObject)



Field: Integer;

end;



var

MyClass: TmyClass;

begin



MyClass^.Field:=0; // Қате! Ол былай жазылуы тиіс.



MyClass.Field:=0;

end.



Негізгі ұғымдар

Класстар – бұл күрделі программаларды жеңілдету және оның сапасын арттыру үшін ойластырылған программистердің ерекше өнер табысты. Кластардың негізінде үш іргелі принцип жатыр, олар инкапсуляция, мұрагерлік және полиморфизм.



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

Класс- өрістер, әдістер мен қасиеттер деп аталатын үш маңызды ұғымның бірлігін береді. Осы үш маңызды ұғымды бір бүтінге біріктіру инкапсуляция деп аталады. Көпшілік жағдайда, инкапсуляция класты программаның қалаған бөліктерінен оқшаулауға мүмкіндік береді, нақты бір есепті шешудің «өзіндік жеткіліктігін» арттырады. Нәтижесінде класс қандай да бір басқарушылықты атқарады. Мысалы, TForm класы Windows –терезесін құруға қажеттілерден, TМemo класы – толық басқарылатын мәтіндік редактор жұмысын, Ttimer класы программа жұмысын таймермен қамтамасыз ететін құралдарды қамтиды (немесе инкапсуляциялайды)

Сонымен, инкапсульяция дайын программалық жабдықтаумен жұмыс істеуге арналған қуатты құрал болып табылады. Delphi жүйесінің кластар кітапханасы- бұл программа құруға арналған Borland фирмасының программистері құрған кірпіштер жиынтығы екен.

Мұрагерлік

Кез-келген класс басқа кластан туындайды. Ол үшін оны хабарлағанда ата –ана кластың аты көрсетіледі:

TchildClass=class(TParentClass)

Туындаған класстар автоматты түрде өзінің ата – анасының өрісі, әдісі және қасиеті шығады және олардың жаңамен толықтырылуы мүмкін. Сөйтіп, мұрагерлік принципі күрделі кластарды кезеңмен құруды және өзінің жеке кластар кітапханасын жасауға мүмкіндік береді.

Object Pascal –дың барлық кластары жалғыз ата-ана TObject класынан туындаған. Бұл кластың өрісі және қасиеттері жоқ, бірақ өзіне кез-келген объектілердің барлық өмірлік қасиеттерін қамтитын жалпы тағайындалудың әдістерін қамтиды. Программист TОbject класы ата – ана болмайтын класс құра алмайды. Оған төмендегідей бейнелеулер тән:

TaClass=Class(TObject)

TaClass=Class

Мұрагерлік принципі TObject класынан оның ұрпақтарына қарай дами отырып, біртіндеп кеңейетін тармақталған кластар құруға әкеледі. Әрбір ұрпақ өзінің ата-анасының мүмкіндіктерін толықтырып (жаңартып), оның өзінің ұрпақтарына беріп отырады.




Полиморфизм

Полиморфизм –бұл мағынасы ұқсас мәселелерді әр түрлі тәсілмен шешетін кластар қасиеті. Object Pascal-дың шеңберінде кластардың қасиеті оған кіретін әдістердің жиынтығымен анықталады. Класс ұрпақтарындағы қандай да бір әдістің алгоритімін өзгерте отырып, программист бұл ұрпаққа ата –анасында жоқ ерекше қасиетті бере алады. Әдісті өзгерту үшін оны сол ұрпақта жабу қажет, яғни ұрпақты бір атаулы әдісті хабарлап, оған қажетті әрекетті жүзеге асыру қажет. Нәтижесінде, объект-ата-ана мен объект-ұрпақта әртүрлі алгоритмдік негізі бар, объектілерге әртүрлі қасиет беретін екі бір атаулы әдіс жұмыс істейтін болады.

Object Pascal тілінде полиморфизм тек жоғарыда сипатталған мұрагерлік механизмі мен ата –ананың әдісін жабумен шектелмейді, сондай –ақ оларды виртуаландыруда жүзеге асады.

Кластың құраушылары

Өріс

Өріс деп кластағы инкапсуляцияланған мәліметтерді айтады. Өріс кез келген типті болуы мүмкін, оның ішінде класта болуы мүмкін;

Мысалы:

type


TMyClass=class

AIntField:integer;

AstrField:String;

AObjectField:Tobject;

……………

End;


Әрбір объект өрістер жиынтығын алады, бірақ осы кластың барлық объектілері үшін жалпы қасиеттер мен әдістер жиынтығы бар. Инкапсуляцияның іргелі принципі өріске кластың әдістері мен қасиеттерінің көмегі арқылы қатынас жасау керектігін талап етеді. Бірақ Object Pascal тілінде өріске тікелей шығуға рұқсат етіледі.

type


TMyClass=class

AIntField:integer;

AstrField:String;

AObjectField:Tobject;

……………

End;


Var aObject. TMyClass;

Begin


……………

AObject.FindField:=0;

AObject.FStrField:=’символдар жолы’;

………………….


end;

Класс- ұрпақ өзінің барлық аталарынан барлық өрістерді ала алады және оны өзінікімен толықтырады, бірақ алдын ала анықтай алмайды немесе өшіре алмайды. Сөйтіп, тармақ иерархиясында класс қаншалықты төмен орналасса, соншалықты оның объектілерінен мәліметтер ала алады.



Әдістер

Класта инкапсуляцияланған процедуралар мен функциялар әдістер деп аталады. Олар әдеттегі қосалық программалар тәрізді хабарланады:


Тype TMyClass=class

Function MyFunc(aPar:Integer):integer;

Procedure MyProc;

End;
Кластың әдістеріне кіру оның өрістеріне кіргендей құрама атаулардың көмегімен жүзеге асырылады.

Var

AObject:TmyClass;



Begin

………


AObject:MyProg;

………


end;

Жоғарыда айтылғандай кластың әдістері ұрпақтарында жабылып тұруы мүмкін. Мысалы,

Type

TparentClass=Class



Procedure DOWork;

End;


TChildClass=Class(TParentClass);

Procedure DOWork;

End;
Екі кластың ұрпақтары да DOWork процедурасының атауы бойынша ұқсас әрекеттерді орындау мүмкін. Бірақ, бұл жалпы жағдайда әртүрлі орындалады. Әдістерді мұндай ауыстыру статикалық деп аталады, яғни компилятормен программаны жүргізу кезеңінде жүзеге асырылады. Object Pascal тілінде программаны жүргізу кезеңінде әдістерді динамикалық ауыстыру жиі пайдаланылады. Мұны жүзеге асрыу үшін аталық класта оранласқан әдіс динамикалық (dynamic директивасымен) немесе виртуалды (virtual) түрде хабарлануы тиіс. Осындай хабарлауды кездестіргеннен кейін компилятор екі кесте құрады: DMT (Dynamic Method Table) және VMT (Virtual Method Table), оларды сәйкес динамикалық немес виртуалдық әдістердің кіру нүктесіндегі адреске орналастырады. Әрбір ауыстырылатын әдіске оралған компилятор сәйкес кестелердің бірінен қосалқы прогаммаға кіру нүктесінің адресін шығаруға мүмкіндік беретін кодты қояды.

Класс ұрпағына әдісті алмастыру override (жабу) директивасымен хабарланады. Осы нұсқауды алғаннан кейін, компилятор программаны жүргізу кезеңінде ата-аналық кестесіне класс-ұрпақ әдісінің кіру нүктесін орналастырады, ал аталыққа жаңа әдістің көмегімен қажетті әрекетті орындауға мүмкіндік береді.

Мысалы, аталық класс Show және Hide әдістерінің көмегімен экранда бейнені көрсетеді немесе жасырады. Бейнені құру үшін длогикалық параметрі бар DRAW әдісін пайдаланады:

Type


TVisual Object=class(TWinControl)

Procedure Hide;

Procedure SHOW;

Procedure DRAW(IsSHOW:Boolean):Virtual;

End;

TVisualChildObject=class(TVisual Object)



Procedure DRAW(IsSHOW:Boolean):override;

end;


Show және Hide әдістерінің жүзеге асырылуы өте қарапайым:

Procedure TVisual Object.SHOW;

Begin

DRAW(True);



End;

Procedure TVisual Object.Hide;

Begin

DRAW(false);



End;

Аталық және ұрпаққа DRAW әдісінің жүзеге асырылуы әртүрлі және әртүрлі бейнелер құрылады. Нәтижесінде, SHOW және Hide аталық әдістері - өзінің кез келген ұрпағындағы DRAW әдісінің нақты жүзеге асырылуына тәуелді болады. Динамикалық байланыстыру толығымен кластар полиморфизмін жүзеге асырады.

Динамикалық және виртуалдық әдістердің арасындағы айырмашылығы- динамикалық әдістер кестесінде осы класта тек dynamic ретінде хабарланған әдістер адрестері болады, ал виртуалдық кестесінде сол кластын вертуалдық әдістерімен қатар, оның барлық аталықтарының да адрестері сақталады. Көлемі айтарлықтай VMT келесі жылдам іздеуді жүзеге асырады, сондай-ақ, динамикалық әдіске оралғанда программа алдымен DMT объектінің кестесін қарап шығады, одан кейін аталық класын қажетті кіру нүктесі табылғанша іздейді.

Динамикалық жабылатын әдістер ешнәрсе орындамауы мүмкін. Мұндай жабылатын әдістер ешнәрсе орындамауы мүмкін. Мұндай әдістер абстрактылы әдістер деп аталады, олар ұрпақтарында жабылуға міндетті. Прогаммист abstract директивасымен хабарлау арқылы абстракт әдісі шығаруға тосқауыл қоя алады. Мысалы:

Type

TvisualObject=class(TWinControl)



….

Procedure DRAW(IsSHOW:Boolean);

Virtual;abstract; end;

TVisualChildObject=class(TWinControl)

......

Procedure DRAW(IsSHOW:Boolean):override;



End;

Var


aVisualObject:TvisualObject;

aVisualChild:TvisualChildObject;

begin



aVisualObject.SHOW; {қате / Абстракт әдіс шақырылды}



aVisualChild.SHOW {Шақыру дұрыс. TVisualChildObject класындағы DRAW әдісі жабылған}

End;


Жабылмаған абстракт әдісті шақыру орындалу барысында қате болып есептеледі. Сауатты құрылған прогрммада абстракт әдіс шақырылмайды.

Кез-келген класстың құрамына екі арнайы әдіс кіреді: конструктор және деструктор. Tobject класында бұл әдістер Create және Destroy деп аталады. Конструктор динамикалық жадыда объектілерді үлестіреді және жадының осы адресіне SELF айнымалысын орналастырады, ал автоматты түрде класта хабарланады. Конструктор және деструктор процедура болып табылады, бірақ Constructor және destructor қызметші сөздерінің көмегімен хабарланады:


Type

TMyClass=class

IntField:integer;

ConstructorCreate(Value:integer);

Destructor Destroy;

End;
Көптеген конструкторлар объектінің дұрыс жұмыс істеуіне қажетті қандай да бір әрекетті орындайды. Сондықтан класс ұрпақ конструкторында алдымен өзінің аталық конструкторын шақыру қажет, одан кейін қосымша әрекеттер жүзеге асырылады. Аталық кластағы кез-келген әдісті шақыру Inherited (мұрагер) қызметші сөзінің көмегімен жүзеге асырылады:

Constructor TMyClass.Create (Value:integer);

Begin


InheritedCreate; // Мұрагер конструкторды шақыру

Inherited:=Value //Қосымша әрекетті орындау

End;
Кейбір әдістер объектіні құрмай және иницилизация жасамай-ақ шақырылуы мүмкін. Мұндай әдістер кластың әдістері деп аталады, олар Class қызметші сөзінің көмегімен шақырылады.

Type


TMyClass=class(TObject)

Class Function GetClassName:String;

End;

S:string;



Begin

S:=TmyClass.GetClassName;

…..

End;


Кластың әдістері өрістерін шақыра алмайды, жалпы жағдайда объект құрмай –ақ шақырылады. Әдетте класс туралы қызметші ақпаратпен шектеледі: класс аты, аталық класс аты, әдістің адресі және т.б.

Бір атаулы әдістер

Бір кластың шеңберінде бірнеше бір атаулы әдістерді пайдалануға болады. Жоғарыда сипатталған аталық әдісті жабу тәсілі ұрпақтың жабылған аталық әдісті «көрмеуіне» әкеледі. Оны тек Inherited қызметші сөзінің көмегімен шақыруға болады.

Бір атулы әдіс табылатын болса, Delphi компиляторы класта осыған ұқсас әдіс басқа параметрмен келтірілгендігі туралы ескертеді.

Бір атаулы әдісті хабарлау үшін reintroduce қызметші сөзі пайдаланылады.

Келесі мысалда TForm 1 класында 4 бір атаулы әдіс-Close пайдаланылады. Олардың тек біреуі-параметрсіз мұрагер әдіс-өзінің негізгі қызметін атқарып, терезені жабады. Ал, қалған үшеуі параметржинағымен ерекшеленіп, терезе тақырыбына хабарлама шығарады.

Бос формаға төрт TButton батырмаларын орналастырып, оған OnClickын өңдеушілерін жазыңдар:

Procedure TForm1.Button1Click(Sender:TObject).

Begin


Close(“символдар жолы”)

End;


Procedure TForm1.Button2Click(Sender:TObject);

Begin


Close(123)

end;


Procedure TForm1.Button3Click(Sender:TObject);

Begin


Close(20,300)

end;


Procedure TForm1.Button4Click(Sender:TObject);

Begin


Close

end;


Енді Private бөліміне TForm1 класының хабарлануы үшін төмендегідей үш Close әдісін орналастыруға болады:

Private{ Private declaration}

Procedure Close (S:String); reintroduse; overload;

Procedure Close (I:Integer); reintroduse; overload;

Procedure Close (I,J:Integer); reintroduse; overload;

Одан кейін Implementation е хабарланған әдістердің сипатталуын жазыңдар:

Procedure TForm1. Close (S:String);

Begin


Caption:=S

End;


Procedure TForm1. Close (i:integer);

Begin


Caption:=IntToStr(i)

End;


Procedure TForm1. Close (i,j:integer);

Begin


Caption:=IntToStr(i*j)

End;грамма орындалғанда алғашқы үш батырма TForm1 класының Close әдісін шақырады және терезенің тақырыбы ауысады, сонымен қатар Button4 батырмасы тәрізді аталық TForm класының Close әдісін шақырып, терезені жабады.



Қасиеттер

Қасиеттер – бұл өріске кіру мүмкіндігін реттейтін кластардың арнайы механизмі.

Қасиеттер property, read және write қызметші сөздерінің көмегімен хабарланады (read және write сөздері тек қасиетті хабарлау контексінде пайдаланатын қызметші сөздер). Әдетте қасиет қандайда бір өріспен байланысты болады және осы өріске жазуда немесе одан оқуда пайдаланатын кластың әдістерін көрсетеді. Мысалы:

Type

TaClass=class



IntField:integer;

Function.GetField:integer;

Procedure SetField (Value&integer);

Property IntegerValue:integer read

GetField write SetField;

End;


Программа контексінде қасиет өзін әдеттегі өріс ретінде көрсетеді.

Сондай-ақ, төмендегідей операторларды жазуға болады:

Var

aClass:TaClass;



Value:integer;

Begin


aClass:=TaClass.Create {емесе қасиетті шақырар алдындағы конструктордың міндетті шақырылуы}

aClass.InterValue:=0;

Value:=aClass.InterValue;



aClass.Destory; // керек емес объектіні өшіру

Мұнымен бірге, төмендегідей меншіктеу операторының жазылуы мүмкін:

aClass.IntField:=NewValue;

Бұл оператормен төмендегі оператордың арасындағы айырмашылық-қасиетті шақырғанда SetField әдісі автоматты түрде қосылады және арнайы әрекеттер орындалады.

Оқу программасында келтірілген

LbOUTPUT.CAPTION:=’жол’

Операторын еске түсірейік.

Label компонентінің Caption қасиеті SetText әдісін шақырады, ол ішкі айнымалыдағы символдар жолын сақтап қана қоймай, жаңа мәтінді де еске сақтайды.

Егер қасиетті арнайы оқу немесе жазу үшін қажеттілік болмаса сәйкес әдістің атауының орнына өріс атауын көрсетуге болады:

Type

TaClass=class



IntField:integer;

Procedure SetField (Value:integer);

Property IntegerValue:integer read IntField write SetField;

End;


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

Шынында, ол қасиеттің өзінің типіндей мәліметтерден қандайда да бір әрекетті жүзеге асыратын бір немесе екі әдісті сипаттайды.



Кластарды хабарлау

Жаңадан құрылатын кез келген класс төмендегідей қызметші сөздермен анықталатын секциялардан тұрады: Private (жабылған), protected (қорғалған), public (мүмкін) және automated (автоматтандырылған). Әрбір секцияның ішінде басында өріс, одан кейін әдістер мен қасиеттер анықталады.

Секциялар класы сипаттау элементтерінің көрінетін бөлінгін анықтайды. Public секциясы ондағы көрсетілген өрістердің көріну бөлігіне шектеулер жасамайды, әдістер мен қасиеттерді кез келген басқа программа модулінде шақыруға болады. Published секциясы көріну бөлігін шектемейді, бірақ мұнда тек орындалу кезеңінде ғана мүмкін болатын қасиеттер ғана емес, программа құру кезеңіндегі қасиеттер жащылады (яғни объектілір инспекторы терезесінде).

Published секциясы тек стандартты мес компоненттерді жасауда пайдаланылады. Delphi ортасы формаға орнатылған компоненттерді сипаттауды арнайы аты жоқ секцияғаорналастырады, ол класс тақырыбынан кейін жазылады да, бірінші хабарланған секцияға дейін жалғасады. Бұл секция Published деп аталады.

Private секциясы көріну бөлінген ең төменгі деңгейде дейін кішірейтеді: жабық элементтердің сипатталуы осы кластың ішіндегі, яғни класс сипатталған модульде орналасқан әдіс пен қосалқы программаға ғана пайдаланылады. Protected секциясы тек сол кластың әдістері үшін, сондай-ақ, кез келген оның ұрпақтары үшін пайдаланылады, бірақ оның орналасуына тәуелсіз.

Private секциясында хабарланған элмент, егер ол басқа модульде орналасқан болса, тіпті кластың жақын ұрпақтары үшін де пайдаланылмайды. Automated секциясы OLEін автоматтандыру интерфейсінде қосылатын қасиеттер мен әдістерді хабарлау үшін пайдаланылады; бұл секцияның мүшелерінің көріну бөлігі шектелмеген.

Object Pascal де кез келген секцияны бірнеше рет, яғни қажетіне қарай хабарлай беруге болады, секцияларды пайдаоанушы қалауынша орналастыруына болады. Кез келген секция бос болуы мүмкін. Келесі программа фрагменті секциялардың экрандағы көріну бөлігін сипаттайды.

Unit Unit1;

Interface

Uses Controls, Forms;

Type

TForm1=class(TForm)



Button1:TButton;

Private


FintField: integer;

Procedure SetValue(Value:Integer);

Function GetValue:Integer;

Published

Property IntField: read GetValue write SetValue

Protected

Procedure Proc1;

Public


Procedure Proc2;

End;


Var

Form1:TForm1;

Implementation

Procedure TForm1. Proc1;

Button1.Color:=clBtnFace;

FIntField:=0;

IntField:=0;

Proc1;


Proc2;

End;


Begin

Form1.Button1.Color:=clBtnFace;

Form1. FLintField:=0;

Form1. IntField:=0;

Form1.Proc1; //Бұл жазу қате!

Form1.Proc2;

End;

Unit Unit1;



Interface

Uses Controls, Unit1;

Type

TForm2=class(TForm1)



Button2:TButton;

Procedure Button2

Procedure Button2Click(Sender:TObject);

End;


Var

Form2:TForm2;

Procedure Tform2.Button2Click(Sender:TObject);

Begin


Button1,Color:=clBthFace;

FintField:=0; // Бұл жазу қате!

Proc1;

Proc2;


End;

Begin


Form1.Button1.Color:=clBthFace;

Form1.FintField:=0; // Бұл жазу қате!

Form1.IntField:=0;

Form1.Proc1;//Бұл жазу қате!

Form1.Proc2;

End;


Класс — ұрпақты хабарлауда класс элементтерін бір көріну бөлігінен басқа бөлігіне алмасиыруға болады. Алдыңғы мысал үшін төмендегідей хабарлауды жазуға болады:

Type


Tform2=class(TForm2)

...


Public

Procedure Proc1;

...

end;
Осындай хабарлаудан кейін Unit2 модулін былай шақыруға болады:



Form2.Proc1;

Private секциясына алмастыру жасағаннан кейін хабарлау элементі ұрпақтарына көрінбейді (егер ұрпақ басқа модульде хабарланған болса), онда кейін оны басқа секцияға орналастыруға болмайды.

Класс модульдің тек интерфейстік бөлігінде немесе жүзеге асырудың бастапқы кезеңінде хабарланады. Класты қосалқы программаның сипаттау бөлігінде анықтауға болмайды.



Достарыңызбен бөлісу:
1   ...   8   9   10   11   12   13   14   15   16




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

    Басты бет