Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
дедфи.doc
Скачиваний:
39
Добавлен:
18.02.2016
Размер:
2 Mб
Скачать

Сурет 1.3 Delphi –дегі кластар тармағы

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

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

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

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

Мысалы:

Type

TMyClass=class

AIntField:Integer;

AstrField:String;

AObjectField:TObject;

……………………….

End;

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

Type

TMyClass=class

FIntField:Integer;

FstrField:String;

………………….

End;

Var aObject:TMyClass;

Begin

………………..

AObject.FintField:=0;

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

……………………….

End;

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

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

Type 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 (TParent Class);

Procedure DOWork;

End;

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

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

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

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

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; {қате / Абстракт әдіс шақырылды}

aVisualObject. SHAW {Шақыру дұрыс. TvisualChildObject класындағы DRAW әдісі жабылған}

… End;

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

Type

TMyClass=class

InField:Integer;

Constructor Create (Value:integer);

Destructor Destroy;

End;

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

Constructor TMyClass.Create (Value:Integer);

Begin

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

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

End;

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

Type

TMyClass=class (TObject)

Class Function GetClassName:String;

End;

Var

S:string;

Begin

S:=TMyClass.GetClassName;

End;

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

Қасиеттер-бұл өріске кіру мүмкіндігін реттейтін кластардың арнайы механизмі. Қасиеттер 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.Creat {Өрісті немесе қасиетті шақырар

алдындағы конструктордың міндетті шақырылуы}

aClass.InterValue:=0;

Value:=aClass.InterValue;

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

end;

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

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;

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

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

Жобаның құрылымы. Жоба файлы Object Pascal тілінде жазылған, компилятормен өңдеуге арналған программа болып табылады. Бұл программа Delphi – де автоматты түрде құрылады, бірнеше жолдардан тұрады. Оны көру үшін Delphi – ді шақырып, бас менюден Project/View Source опциясын таңдаңыз. Delphi Project1 мәтінінен тұратын код терезесін шығарады:

Program Project1;

Uses

Forms,

Unit1 in ‘Unit1.pas’ {fmExample};

{SR*. RES}

Begin

Application. Unitialize;

Application. Greate Form (TfmExample, fmExample );

Application. Run;

End.

Код терезесінде қарайтылған шрифтпен қызметші сөздер жазылған, ал курсивпен фигуралық жақша ({}) ішіне түсіндірме жазылған. Программа мәтіні Program сөзінен басталып, End сөзімен аяқталып тұр. End сөзінен кейінгі нүктеден соң жазылған жазуды программалық бірліктің терминаторы деп атайды. Егер программа мәтінінде осындай терминетор кездесетін болса, компилятор программаны жолдауды тоқтатып, мәтіннің қалған бөлігін ескермейді (жойы жібереді).

Object Pascal тілінде қызметші сөздер маңызды роль атқарады. Әрбір қызметші сөз компиляторға шартты нұсқау береді, тек ағылшын тілінде жазылады.

Ал түсіндірменің компилятор үшін ешқандай мәні жоқ, түсіндірме кездессе, компилятор оны қалдырып кетеді. Программадағы түсіндірме программист үшін аса маңызды, ол программаны түсінуді жеңілдетеді. Object Pascal тілінде фигуралық жақшаға ({}) алынған кез келегн символдар тізбегі түсіндірме болып есептеледі.

Жоғарыдағы келтірілген мәтінде екі түсіндірме бар, бірақ {SR*. RES} жолы шын мәнінде түсіндірме емес. Бұл арнайы түрде жазылған фрагменті – компилятор директивасы деп аталады. Директивалар S символынан басталады. Түсіндірме үшін сондай – ақ, (*,*) және // белгілері де пайдаланылады. (*.*) – фигуралық жақша тәрізді, ал // символдары компиляторға түсіндірменің ағымдағы жолдың соңына дейін жазылатынын ескертеді.

Program сөзінен кейінгі жазылған атау мен соңынан қойылған «;» программа тақырыбын құрайды. Тақырыптан кейін бейнелеу бөлімі жазылады, Мұндағы программист программада пайдаланылатын идентификаторларды сипаттайды. Идентификаторлар типер, айнымалылар, процедуралар, функциялар тәрізді программа элементтерін белгілейді. Uses қызметші сөзінен кейін басталатын сөйлемнің көмегімен программист программаның ажырамайтын құрамдас бөлігі ретінде қарастырылатын, басқа файлдарда орналасатын программа фрагменті (модульдер) туралы компиляторға хабарлайды.

Программадағы:

Uses

Forms,

Unit1 in ‘Unit1.pas’ {fmExample};

Жолдар программада файл жобамен қатар, Forms және Unit1 модульдері пайдаланатындығын көрсетеді. Forms модулі Delphi – де стандартты модуль, ал Unit1 - әлі белгісіз, жаңа модуль, Delphi Мұндағый жағдайда модульдің мәтіні бар файлдың атын да көрсетеді (in ‘Unit1.pas’) және файл модуліне байланысты форманың сипаттамасы {fmExample} – де.

Программа денесі Begin сөзінен басталып, End. Терминеторымен шектеледі. Программа денесі Object Pascal – дың біренеше операторларынан тұрады. Әрбір операторда қандай да бір әрекет жүзеге асырылады – айнымалы мәнін өзгерту, есептеу нәтижесін талдау, қосалқы программаға оралу және т.б. Біздің мысалда программа денесінде үш орындалатын оператор бар:

Application. Unitialize;

Application. Greate Form (TfmExample, fmExample );

Application. Run

Бұлардың әрқайсысы Application объектілер әдісінің біріне оралады. Объект дегеніміз – өңдеуге арналған мәліметтер мен қосалқы программаны қамтитын, арнайы дайындалған программа фрагменті. Мәліметтер деп объектінің өрістерін, ал қосалқы программа деп оның әдістерін айтамыз. Объект тұтасымен алғанда, қандай да бір нақты есепті шығаруға арналған, программада бөлінбейтін бүтін ретінде қарастырылады. Объект қазіргі программалау тілдерінде маңызды роль атқарады. Объектінің басты екі қасиеті бар: оның функционалдығы мен бөлінбейтіндігі.

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

Application объектісінде Windows программаны толығымен басқаруға қажетті мілңметтер мен қосалқы программалар жинақталған. Delphi автоматты түрде әрбір жаңа проект үшін Application объект программасын құрады.

Application. Initialize жолы Application объектісінің Initialize әдісіне оралатынын көрсетеді. Осы жолды оқығаннан кейін компилятор қандай да бір программа фрагментін орындауды талап ететін кодты құрады. Осы фрагментті орындағаннан кейін (яғни программистердің тілімен айтқанда, қосалқы программадан шыққаннан кейін) процессор басқарудыпрограмманың келесі жолына береді, ол Сreate Form әдісі арқылы шақрылады.

Application объектісінің Сreate Form әдісі экранда бас форма терезесін құрып көрсетеді, ал Run – Windows – ден түскен пайдаланушының әрекеті жөніндегі хабарларды үздіксіз алып, оны өңдеуді жүзеге асырады. Пайдаланушы Close батырмасын тышқанмен белгілегенде Windows программаға программа жұмысын тоқтатып, оған бөлінген жүйелік ресурстарды босату жөнінде арнайы хабарлама береді.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]