Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Мұрагерлік






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

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;

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






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.