1.А.Г.Гольцев «Объектно-ориентированное программирование и его реализация в языке Паскаль», Москва-2005
2. В.В.Фараонов «Турбо Паскаль 7.0», Москва-2001
3. Электронный учебник: «Введение в объектно-ориентированное программирование», 2006
1. Объектілі типті жариялау
Паскалда «объект» терминінен шатасуымыз мүмкін, өйткені «объект» термині классты да, осы класстың экземплярын да білдіре береді. Сондықтан, анық болуы үшін бұдан бұлай әңгіме класс туралы болатын болса, «класс» не «объектілі тип» терминдерін қолданамыз, әңгіме экземпляр туралы болатын болса онда «экземпляр (объекттің)» терминін қолданамыз. Барлық объекттер қайсыбір объектілі типтің экземпляры ретінде туындайды. Демек, тип экземплярды жариялаудан (сипаттаудан) бұрын жариялануы (сипатталуы) керек.
Объектілі типті жариялау (сипаттау) 2 бөлімнен тұрады: 1.Класс атауын жариялау. Класс атауы интерфейсті (тәсілдер атауының тізімі) және берілгендер өрісі құрылымын өз ішіне алады. 2.Тәсілдер орындалуларын (реализациясын) жариялау. Класс атауын жариялау type секциясында жүргізіледі. Тип атауынан соң object кілттік сөзі жазылады, бұдан соң өрістер тізімі жазылады, одан кейін тәсіл атауларының тізімі жазылады(нүктелі үтір арқылы).
Тәсіл процедура немесе функция болу мүмкін.
Әдетте, Паскалда объект міндетті түрде Init атаулы инициализации тәсіліне және Done атаулы деинициализации (жойып жіберуге дайындық) тәсіліне ие болу керек.
2. Объект және тәсілді жариялау мысалы
Мысал:
Сөздік сипаттама. Объект – бұл жерде жүгіріп тұрған қатар(бегущая строка). Экранның белгілі бір жерінде төртбұрыш орналастырылуы мүмкін, оның ішіндегі текст қатарлары горизонталь бойынша жылжып отырады. Бұл әрекетті тоқтатуға және іске түсіруге болады.
Әрекеттер(Действия): инициализация (қатарды және оның экрандағы орнын беру), іске түсіру, тоқтату. Деинициализация әрекеті талап етілмейді, бірақ ол ереже бойынша қатысуы тиіс. Сондықтан оның тәсілін объект интерфейсіне тіркейміз, ал орындалуын бос қалдырамыз.
Локал жадының құрылымы: X,Y координаталары, S қатары, әрекеттің іске түскендігінің белгісі - running, жүгірмелі қатардың экранда көрсетілетін ағымдағы бөлігі (текущее смещение от начала строки для показа на экране) - offset.
type TRunnungString = object
x,y: integer;
s:string;
running:boolean;
offset:integer;
procedure Init(xx,yy:integer;ss:string);
procedure Run;
procedure Stop;
function IsRunning:boolean;
procedure Done;
end;
Тәсілдің формальді параметрлерінің атауы объект өрістерінің атауларымен бірдей болмауы қажет. (Init тәсіліне қараңыз).
Тәсіл реализациясының жариялануы және тәсілді шақыру
Класс атауын жариялаудан бөлек, одан әрі программаның процедураларды сипаттау бөлімінде класс атауында келтірілген барлық тәсілдердің орындалуы (реализациясы) жарияланады. Тәсіл орыдалуы процедура не функция сипаттамасына ұқсас сипатталады. Бірақ:
- тәсіл атауының алдынан міндетті түрде классының атауы нүкте арқылы жазылады;
- тәсіл ішінде класс атауында келтірілген объекттің барлық өрістері көрінетін (видимыми) деп есептеледі.
Мәселен, Init тәсілінің орындалуы (реализациясы) мынадай болады:
procedure TRunningString.Init(xx,yy: integer; ss:string);
begin
x:=xx; y:=yy; s:=ss;
end;
Паскаль тілі синтаксисінің ережесі тәсілдің реализациясын (орындалуын) сипаттау кезінде формальді параметрлер тізімін жазбауға рұқсат береді, себебі олар класс атауында келтірілген. Бірақ бұлай істеу керек емес! Программа оқылғанда түсінікті болуы үшін тәсіл реализациясында да формальді параметрлер тізімін келтірген дұрыс.
Жазылған Init тәсілі нені білдіреді? Бұл мынаны білдіреді: TMyObject классының әрбір экземпляры инициализация бойынша әрекет ете алады, және формальді параметр ретінде берілген 2 бүтін сан және қатар инициализация жасалуын қалап отырған экземплярдың өрістеріне орналастырылады.
Алайда, біздің класстың әлі бірде-бір экземпляры жоқ, сондықтан біз сипатталған тәсілдерді шақыра алмаймыз.
Программаға жүгірмелі қатардың экземплярын құру керектігін білдіру үшін айнымалыларды сипаттау бөлімінде былай жазамыз:
var RunningString:TRunningString;
Бұл экземплярды (айнымалыны) пайдаланып программа денесінде мысалы былай жазуға болады:
RunningString.Init(10,10,'Hello, world');
RunningString.Run;
......................
RunningString.Done;
Яғни, тәсілді шақыру үшін объект экземплярының атауынан кейін нүкте қойылып, тәсіл атауы нақты (фактический) параметрлер тізімімен бірге жазылады.
3. Объект экземплярын көрсеткіш арқылы пайдалану
Экземпляр өрістеріне сырттан сілтеме (обратиться) жасауға бола ма? Паскаль тілінің синтаксисі мұндай мүмкіндік береді:
RunningString.x:=25;
Бірақ бұлай ете отырып, біз инкапсуляция принципін бұзамыз. Объекттермен жұмыс істей отырып, тікелей өрістерден оқу не жазу тілегі туындамауы қажет. Объекттерді пайдалана отырып, олардың өрістері бар екендігін ұмытқан дұрыс – объект тек әрекеттерді орындай алады деп есептеңіз. Егер қалай да объект жағдайын білу не оны өзгерту керек болса, онда интерфейс құрамында осындай әрекетті(тәсілді) алдын-ала тіркеп қою керек, тіпті оны сипаттай отырып, «бұл өрісті оқитын тәсіл» демеңіз. (Например, можно ввести метод GetX, но он возвращает "левую границу области прокрутки" (некую характеристику объекта как единого целого), а не "поле X".)
ОБП-дың «жақсы» тілдерінде (Си++, Дельфи, Смолток) объект экземплярын көрсеткіш арқылы ғана пайдалануға болады және ол динамикалық бөлінетін(распределяемый) жадыда ғана туындайды және жойылады. Ал, паскалда жоғарыда қарастырылып кеткен экземплярды тудыру әдісінде(объектілі типтің айнымалысы) экземпляр статикалық жадыға(берілгендер сегментіне) немесе стекқа жазылады. Салмақты программаларды жазу барысында бұлай етпеу керек, өйткені:
- берілгендер сегменті мен стек көлемі шектелген, ал объект экземплярлары көп орын алуы мүмкін;
- объекттерге көрсеткіштерді қолданған жағдайда ғана ОБП-ң барлық мүмкіндіктерін пайдалануға болады.
«Класс экземплярына көрсеткіш» типін ендіреміз және экземплярды тудырамыз:
type PRunningString:^TRunningString;
var RunningString:PRunningString;
..............................
new(RunningString);
RunningString^.init(10,10,'Hello world');
RunningString^.Run;
......................
RunningString^.Done;
dispose(RunningString);
4. Объект экземплярларымен жұмыс істеуде WITH операторын қолдану
Объект экземплярлары үшін де with операторын қолдана аламыз. With операторы өз денесіне жазылған барлық идентификатоларға көрсетілген объект экземплярының атын қосып көрсетеді, егер тәсіл мен өріс атаулары расында да бар болса, ондаатаулар дәл солай жазылғандай болып қабылданады. Жоғарыда жазылған кодты былайша жазуға да болады(тек қана қысқылық үшін):
with RunningString do begin
init(10,10,'Hello world');
Run;
.................
Done;
end;
With операторы программа жұмысын тездетеді деп ойламау керек, ол тек прогрпмма текстін ықшамдайды. With операторының ішінен тағы да with операторын қолдану программаның түсініксіз етеді. Сондықтан, оны әдетте бір объекттің тәсілдерін көпқайтара шақырған кездерде ғана қолданған дұрыс.
Достарыңызбен бөлісу: |