Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Мұрагерлік
Кез-келген класс басқ а кластан туындайды. Ол ү шін оны хабарлағ анда ата –ана кластың аты кө рсетіледі: 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; Кластың ә дістері ө рістерін шақ ыра алмайды, жалпы жағ дайда объект қ ұ рмай –ақ шақ ырылады. Ә детте класс туралы қ ызметші ақ паратпен шектеледі: класс аты, аталық класс аты, ә дістің адресі жә не т.б.
|