- Объекттерді топтық меншіктеу
Паскалда объекттер үшін меншіктеу операторы анықталған. Егер екі айнымалы бірдей тип-объектке ие айнымалылар ретінде жарияланса, онда былай жазуға болады:
Obj1:=Obj2;
Бұл жағдайда Obj1-ң барлық өріс мәндері Obj2-ң сәйкес өрістеріне көшіріліп өткізіледі.
Топтық меншіктеуді ретсіз пайдалануға болмайды. Кейбіреулер инкапсуляцияНекоторые источники рассматривают его как посягательство на принцип инкапсуляции — ведь мы считаем (а компилятор проверяет), что эти два объекта устроены одинаково внутри, а мы, «находясь вне» обоих, не должны так считать. Алайда, Паскалда бұл бір экземплярдан екіншісіне өрістер мәнін көшірудің ең тиімді жолы.
Дельфи тілінде (объект экземплярларын көрсеткіш арқылы ғана пайдалануға болатыны бізге белгілі) топтық меншіктеулер қолданылмайды, мұның орнына параметрлі Assign тәсілі анықталған. Оның параметрі-объект, осы объекттің өріс мәндері қабылдап алынады. Топтық меншіктеуден айырмашылығы мынада: әрбір класста бұл тәсіл өзінше анықталған және өрістерді көшіру мүмкіндігін, көшіру процессін жұмсақ(гибко) басқаруға жағдай жасалынған.
Объект экземплярлары программалау тілдерінде қарастырылған берілгендердің құрылымдық типтерінің элементтері боп табылуы мүмкін – жазу өрістері, массив элементтері. Айта кететін жайт – құрылымдарда объекттердің орнына олардың көрсеткіштерін пайдаланған дұрыс.
Паскалда объекттер файлын құру құралы жоқ. Бұл логикалық тұрғыдан дұрыс, өйткені файл –бұл ұзақуақтылы жадыда сақталынатын пассив берілгендер. Дербес жағдайда, берілгендер файлында тәсіл кодын сақтау – бұл логикаға жатпайды, ал тәсілден үзіліп қалған объект өрістері– бұл енді объект емес, оның тек жартысы. Бұл жағдайда енді сөз ОБЪЕКТТІ сақтау туралы емес, оның локал жадысын сақтау туралы болады.
Егер берілген мәселе объекттердің қалай да файлда сақталынуын талап етсе, онда бұл үшін арнайы файл ішіндегі объект көрінісінің айрықша форматын және Read пен Write әрекеттерін орындайтын арнайы тәсілдер дайындау қажет, яғни, «объект көрінісін қалыптастыру және оны файлға жазу» мен «осы объекттің сипаттамасын файлдан оқу және сипаттамаға сәйкес инициализация жасау».
Бір объекттің экземплярлары басқа бір объекттің өрістері ретінде пайдаланылуы мүмкін. Бұл әдісті кейде ішкі немесе объекттердің «ұялануы» («гнездованием» объектов) деп те атайды.
Қажеттілік туындамаса статикалық экземплярды ішкі етпеген дұрыс. Ең дұрысы, өріс ретінде объектке көрсеткішті қолдану, ол контейнер ішіне физикалық (шын мәнінде) емес, логикалық тұрғыдан енеді. Шын мәнінде бұл өз бетінше бөлек бір объект болады және оған сырттан көрсеткіш сұрап, онымен ОБП принциптерін бұзбай жұмыс істеуге болады.
- Мысал
Айталық, автосервисте автомобильдердің техникалық диагностикасын басқаратын программа дайындалып жатыр. Программада мынадай класстар бар: Автомобиль, Двигатель, Тормоздық жүйе, Жанармай багы.
Автомобильдің егер оның барлық жүйелері дұрыс істеп тұрса және бакқа жанармай құйылған болса жағдайы жақсы деп есептейік.
Әрине, Автомобиль-объекттер өз құрамына кіретін объекттер: двигатель, тозмоздық жүйе, жанармай багы туралы мәлімет алып отыруы керек деуіміз орынды. Автомобиль классын сипаттау барысында Автомобиль, Двигатель, Тормоздық жүйе, Жанармай багы класстарының экземплярлары Автомобиль классының өрісі деп беруіміз мүмкін. Алайда, бұл жағдайда жүйе двигатель, тормоздық жүйе, жанармай багын пайдалана алмай қалады, өйткені олар Автомобиль классы экземплырының жасырын өрісі. Бірақ, Автомобиль сұраныс бойынша өз двигателіне көрсеткішті қайтаруы (возвращать) мүмкін.
Бұл жағдайда да, былайша айтқанда, бір Автомобильдің двигателін екіншісіне ауыстырып қоюға болмайды.
Егер Автомобильдің өрістері ретінде объекттерге(Двигатель, Тормоздық жүйе, Жанармай багы) көрсеткіштер қолданылатын болса, онда әлдеқайда дұрысырақ болады.Бұл жағдайда осы объекттер Автомобильден тәуелсіз өз алдына бөлек болады, ал автомобиль енді двигательге ие болмауы да мүмкін (сәйкес көрсеткіш nil мәніне тең).Автомобильдерге хабрлама жіберу арқылы двигательді бір автомобильден екіншісінеауыстырып қоюға болады.
Двигательді_шешу::= ағымдағы Двигательге көсеткішті қайтару және оны осы объектте нольге айналдыру