Объекттердің модульде жариялану ерекшеліктері.
Жоспар:
1. Объекттердің модульде жариялану ерекшеліктері
2. SELF параметрі және тәсілді шақыру
1. Объекттерді топтық меншіктеу
2. Берілгендердің объектілі және құрылымдық типтері
3. Мысал
Әдебиеттер:
1.А.Г.Гольцев «Объектно-ориентированное программирование и его реализация в языке Паскаль», Москва-2005
2. В.В.Фараонов «Турбо Паскаль 7.0», Москва-2001
3. Электронный учебник: «Введение в объектно-ориентированное программирование», 2006
1. Объекттердің модульде жариялану ерекшеліктері
Объектілі типтерді Паскаль тілінің модульдерінде(unit) жариялап, бұдан соң басқа модульдерде не негізгі программада пайдалануға болады. Әдетте үлкен мәселелерді шешуде осындай принципті қолданады. Модульдермен жұмыс істеу барысында класс атауы, егер ол экспортталатын болса, яғни модуль сыртында да экземпляр тудыру үшін қолданылуы тиіс болса, interface бөлімінде сипатталады, ал тәсілдер реализациясы - implementation бөлімінде.
Турбо Паскалдың 7-ші версиясында модульде жарияланған класс тәсілдері мен өрістерінің көрінуін сыртта (модуль сыртында, яғни басқа модульдерде) шектейтін құрал бар. Бұл public және private директивалары. Олар класс атауында бірнеше рет кездесуі мүмкін. Мұндай директивадан кейін өрістер мен тәсіл атаулары келтіріледі және оларға сәйкесінше public немесе private атрибуты беріледі. Үнсіз келісім бойынша (өрістер мен тәсілдер бұл директиваларды қолданбай сипатталса) public атрибуты беріледі.
public – класс өрістері мен тәсілдері программаның кез-келген жерінен көріне алады(олар объектте бар деп есептеледі).
private – класс өрістері мен тәсілдері сол класс қайсы модульде жарияланған болса сол жерде ғана көріне алады.
Средств, чтобы сделать поля и методы видимыми только изнутри самого объекта (его методов) в Турбо Паскале нет. В Дельфи это директива protected.
Мысалы:
unit A;
interface
type TObj1=object
procedure init;
procedure done;
private
x,y:integer;
procedure Hidden;
end;
var AObj:TObj1;
implementation
...............
begin
AObj.init;
AObj.x:=10; {здесь - можно}
AObj.Hidden;
end.
-----------------------------
program My;
uses A;
begin
AObj.init;
AObj.x:=10; {а здесь так нельзя}
AObj.Hidden;
end.
Объекттерді жадыда орналастыру
Бір класстың барлық экземплярлары үшін жады өріске ғана бөлінеді.
Бір класстың барлық экземплярларының тәсілдері код сегментінде бір мәрте ғана жазылады, яғни, сол бір тәсіл берілген класстың барлық экземплярларына қызмет етеді. (Для всех экземпляров одного класса память выделяется только под поля.)
Объект экземпляры өз тәсілдеріне көрсеткішке ие емес (Бұған кейінірек тоқталамыз).
2. SELF параметрі және тәсілді шақыру
Тәсілді шақыру кезінде оған тағы бір параметр жіберіледі, бұл тәсілді шақырып отырған объект экземплярына алыс (дальний) 32-битті көрсеткіш. Бұл көрсеткіш Self идентификаторы арқылы қолданылады.
Егер тәсіл жұмысының логикасы объекттің өзіне-өзі хабар жіберуінде болса(өз тәсілін Self шақырады), онда программаның оқылуын түсінкті ету үшін Self –ті айқын түрде көрсеткен дұрыс. Бұл параметрге шын мәнінде қажеттілік тәсіл ішінде ассемблерді пайдаланған уақытта туады.
Паскалда тәсіл әрдайым алыс шақыруды қолданып шақырылады.
Егер TMyObject классындағы тәсілдің атауы мынадай болса
procedure Init(x,y:integer);
онда шақыру былай жазылған кездегідей орындалады
procedureInit(x,y:integer;var SELF:TMyObject);
және
MyObject^.Init(10,20);
деп шақырылған уақытта стекқа 10,20 сандары ендіріледі, бұдан соң MyObject көрсетіп тұрған жады орнының сегменті мен жылжуы (смещение) ендіріледі. Бұдан кейін компилятор алыс CALL командасын Init тәсіліне ену адресін көрсетумен бірге генерация жасайды (адрес бұл жағдайда қатаң түрде компилятор арқылы жазылады, және ешқандай таблицадан таңдап алынбайды).
3. Объекттерді топтық меншіктеу
Паскалда объекттер үшін меншіктеу операторы анықталған. Егер екі айнымалы бірдей тип-объектке ие айнымалылар ретінде жарияланса, онда былай жазуға болады:
Obj1:=Obj2;
Бұл жағдайда Obj1-ң барлық өріс мәндері Obj2-ң сәйкес өрістеріне көшіріліп өткізіледі.
Топтық меншіктеуді ретсіз пайдалануға болмайды. Кейбіреулер инкапсуляция Некоторые источники рассматривают его как посягательство на принцип инкапсуляции - ведь мы считаем (а компилятор проверяет), что эти два объекта устроены одинаково внутри, а мы, "находясь вне" обоих, не должны так считать. Алайда, Паскалда бұл бір экземплярдан екіншісіне өрістер мәнін көшірудің ең тиімді жолы.
Дельфи тілінде (объект экземплярларын көрсеткіш арқылы ғана пайдалануға болатыны бізге белгілі) топтық меншіктеулер қолданылмайды, мұның орнына параметрлі Assign тәсілі анықталған. Оның параметрі-объект, осы объекттің өріс мәндері қабылдап алынады. Топтық меншіктеуден айырмашылығы мынада: әрбір класста бұл тәсіл өзінше анықталған және өрістерді көшіру мүмкіндігін, көшіру процессін жұмсақ(гибко) басқаруға жағдай жасалынған.
4. Берілгендердің объектілі және құрылымдық типтері
Объект экземплярлары программалау тілдерінде қарастырылған берілгендердің құрылымдық типтерінің элементтері боп табылуы мүмкін – жазу өрістері, массив элементтері. Айта кететін жайт – құрылымдарда объекттердің орнына олардың көрсеткіштерін пайдаланған дұрыс.
Паскалда объекттер файлын құру құралы жоқ. Бұл логикалық тұрғыдан дұрыс, өйткені файл –бұл ұзақуақтылы жадыда сақталынатын пассив берілгендер. Дербес жағдайда, берілгендер файлында тәсіл кодын сақтау – бұл логикаға жатпайды, ал тәсілден үзіліп қалған объект өрістері – бұл енді объект емес, оның тек жартысы. Бұл жағдайда енді сөз ОБЪЕКТТІ сақтау туралы емес, оның локал жадысын сақтау туралы болады.
Егер берілген мәселе объекттердің қалай да файлда сақталынуын талап етсе, онда бұл үшін арнайы файл ішіндегі объект көрінісінің айрықша форматын және Read пен Write әрекеттерін орындайтын арнайы тәсілдер дайындау қажет, яғни, «объект көрінісін қалыптастыру және оны файлға жазу» мен «осы объекттің сипаттамасын файлдан оқу және сипаттамаға сәйкес инициализация жасау».
Бір объекттің экземплярлары басқа бір объекттің өрістері ретінде пайдаланылуы мүмкін. Бұл әдісті кейде ішкі немесе объекттердің «ұялануы» ("гнездованием" объектов) деп те атайды.
Қажеттілік туындамаса статикалық экземплярды ішкі етпеген дұрыс. Ең дұрысы, өріс ретінде объектке көрсеткішті қолдану, ол контейнер ішіне физикалық (шын мәнінде) емес, логикалық тұрғыдан енеді. Шын мәнінде бұл өз бетінше бөлек бір объект болады және оған сырттан көрсеткіш сұрап, онымен ОБП принциптерін бұзбай жұмыс істеуге болады.
5. Мысал
Айталық, автосервисте автомобильдердің техникалық диагностикасын басқаратын программа дайындалып жатыр. Программада мынадай класстар бар: Автомобиль, Двигатель, Тормоздық жүйе, Жанармай багы.
Автомобильдің егер оның барлық жүйелері дұрыс істеп тұрса және бакқа жанармай құйылған болса жағдайы жақсы деп есептейік.
Әрине, Автомобиль-объекттер өз құрамына кіретін объекттер: двигатель, тозмоздық жүйе, жанармай багы туралы мәлімет алып отыруы керек деуіміз орынды. Автомобиль классын сипаттау барысында Автомобиль, Двигатель, Тормоздық жүйе, Жанармай багы класстарының экземплярлары Автомобиль классының өрісі деп беруіміз мүмкін. Алайда, бұл жағдайда жүйе двигатель, тормоздық жүйе, жанармай багын пайдалана алмай қалады, өйткені олар Автомобиль классы экземплырының жасырын өрісі. Бірақ, Автомобиль сұраныс бойынша өз двигателіне көрсеткішті қайтаруы (возвращать) мүмкін.
Бұл жағдайда да, былайша айтқанда, бір Автомобильдің двигателін екіншісіне ауыстырып қоюға болмайды.
Егер Автомобильдің өрістері ретінде объекттерге(Двигатель, Тормоздық жүйе, Жанармай багы) көрсеткіштер қолданылатын болса, онда әлдеқайда дұрысырақ болады. Бұл жағдайда осы объекттер Автомобильден тәуелсіз өз алдына бөлек болады, ал автомобиль енді двигательге ие болмауы да мүмкін (сәйкес көрсеткіш nil мәніне тең). Автомобильдерге хабрлама жіберу арқылы двигательді бір автомобильден екіншісіне ауыстырып қоюға болады.
Двигательді_шешу::= ағымдағы Двигательге көсеткішті қайтару және оны осы объектте нольге айналдыру
Двигательді_орнату::= Көрсетілген жаңа двигательге көрсеткішті өріске сақтау
Достарыңызбен бөлісу: |