- Объект экземплярын көрсеткіш арқылы пайдалану
Экземпляр өрістеріне сырттан сілтеме (обратиться) жасауға бола ма? Паскаль тілінің синтаксисі мұндай мүмкіндік береді:
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);
- Объект экземплярларымен жұмыс істеуде WITH операторын қолдану
Объект экземплярлары үшін де with операторын қолдана аламыз. With операторы өз денесіне жазылған барлық идентификатоларға көрсетілген объект экземплярының атын қосып көрсетеді, егер тәсіл мен өріс атаулары расында да бар болса, ондаатаулар дәл солай жазылғандай болып қабылданады. Жоғарыда жазылған кодты былайша жазуға да болады(тек қана қысқылық үшін):
with RunningString do begin
init(10,10,’Hello world’);
Run;
Done;
end;
With операторы программа жұмысын тездетеді деп ойламау керек, ол тек прогрпмма текстін ықшамдайды. With операторының ішінен тағы да with операторын қолдану программаның түсініксіз етеді. Сондықтан, оны әдетте бір объекттің тәсілдерін көпқайтара шақырған кездерде ғана қолданған дұрыс.