Обекти и обектно-ориентирано програмиране

4. Пример за програма, използваща обекти.

5. Концепцията за динамични обекти.

6. Разширено използване на новата процедура.

7. Освобождаване на хип-паметта от динамични обекти.

1.Принципи на обектно-ориентираното програмиране.

Традиционната посока на развитие на програмирането в продължение на много години беше така нареченото процедурно програмиране, което се основава на концепцията за процедура (подпрограма). В съответствие с това направление се изгражда сложна програма от по-малки части – процедури, декомпозиращи задачата на подзадачи и преодоляващи сложността на първоначалната задача. Въпреки това, с нарастването на сложността на проблема, броят на процедурите расте и тяхното използване изисква (започвайки от определен лимит) собствена поддръжка. Беше забелязано, че ако дължината на програмата стане повече от 1000-1500 реда с процедурния подход, сложността на отстраняването на грешки в такава програма се увеличава значително. Така възникна необходимостта от качествено нов подход към програмирането. Този подход се превърна в обектно-ориентирано програмиране и разработка.

Основата на обектно-ориентираното програмиране е обект, който се разбира не само като съответната структура от данни, но и като набор от процедури, които обслужват тази структура. Структурата на данните и куп процедури се разглеждат като едно цяло, сякаш са затворени в обща обвивка (капсула). Всички средства за достъп до структурите от данни на обекта са концентрирани в тази капсула (това свойство се нарича още капсулиране).

Обектът е градивният елемент за обектно-ориентирана програма. Това оставя съответен отпечатък върху методологията на програмиране: програмистът трябва да мисли от гледна точка на обекти от предметната област и тяхната връзка, а не от гледна точка напо отношение на изолирани процедури.

Обектно-ориентираното програмиране не отрича процедурния подход, а само го издига на по-високо ниво. Капсулирането е декомпозиция на процедури според функционален принцип, който въвежда значителен ред и използване на процедурите. Ползата от използването на обектно-ориентиран подход е толкова по-голяма, колкото по-сложна е програмата. Понастоящем много програми са изградени на базата на обектно-ориентиран подход, а за изграждане на потребителски интерфейс обикновено се признава обектно-ориентиран подход (използва се по-специално в системите Turbo Vision и DELPHI).

2. Концепцията за обект в Turbo Pascal.

Turbo Pascal (започвайки от версия 5.5) въвежда нова концепция за обект като по-нататъшно развитие на концепцията за тип. Подобно на типовете, обектите трябва да бъдат декларирани в раздела за деклариране на програмата. Формата на описанието на обекта е подобна на описанието на типа Record. Единствената разлика е, че ключовата дума за описание е object , а не record , и в допълнение към обикновените полета (елементи на структурата на данните), описанието на обекта използва процедурни полета - заглавията на процедурите и функциите, капсулирани в този тип обект. Освен това се разширяват възможностите за описание на полетата на структурата от данни - освен променливи могат да се описват и необходимите типове данни и константи. Променливите, които формират структурата на данните, се наричат ​​полета на обекта, а процедурите и функциите се наричат ​​методи на обекта. В този случай телата на метода трябва да бъдат описани извън описанието на обекта: обикновено в съответните модули.

Някои полета и методи на обект могат да бъдат обявени за скрити от потребителите на обекта с помощта на директивата private (private, hidden), посочена след публичната част на описанието на обекта. Всички полета и методи, описани след private,са налични само в рамките на модула, където е описан самият обект.

Пример за описание на обект:

тип точка = обект;

За да работите с обекти, в допълнение към описанието на обекта, както при описанието на други типове, е необходимо да декларирате променливи от типа обект, наречени обектни екземпляри. Например, за обекта point, описан по-горе, екземплярите могат да бъдат декларирани: var p1,p2:point;

Съставните имена (имена с точка) се използват за обозначаване на полета и методи на обект, по същия начин, както е обичайно за записите. Например: p1.X:=1; p1.Y:=p1.X; p2.X:=p1.getX; p1.SetColor(green);

В описанието на всеки тип обект имплицитно присъства стандартното име Self от същия тип като самия обект. Това е общото име на екземпляр на обект, който всеки метод може да използва, за да посочи собствеността си върху този обект.

Подобно на записите, достъпът до полетата и методите на даден обект може да бъде улеснен чрез използване на оператора with.

Например: с p1 започнете x1:=getX; y1:=getY край;

За обекти от същия тип е разрешено присвояване, например: p1:=p2;

3. Свойства на наследяване и полиморфизъм на обектите.

Капсулирането, въпреки че въвежда определен ред в използването на данните и процедурите, обаче не намалява броя им, т.к. определя само правилата за използване на собствените средства, концентрирани в капсулата.

Друга важна и мощна идея на обектно-ориентираното програмиране е наследяването на полета и методи на обекти, т.е. способността за прехвърляне на свойствата на наследствени обекти "по наследство" на потомствени обекти. Връзката на наследяване предшественик-дете ви позволява да изградите йерархия от обекти, така че много полета и методи да се описват само веднъж и след това да се използват от много обекти. Така че в същото време е възможнозначително ограничават броя на необходимите описания на процедурите в сложна програма.

Всеки обект може да бъде обявен за наследник на описан по-рано обект-предшественик. В този случай всички методи на неговия предшественик и всички структури от данни на този предшественик стават достъпни за дъщерния обект. В допълнение, наследственият обект е свободен да дефинира свои собствени допълнителни полета и методи и дори да замени методите на родителя. Всеки обект има един (непосредствен) предшественик и всеки предшественик може да има произволен брой деца. Това са обичайните правила на йерархията.

Наследственото свойство се разпространява по веригата, образувайки дърво от свързани обекти. Това дърво има един основен обект, който е предшественик на всички останали обекти. Ако йерархията е добре обмислена, тогава се получава библиотека от обекти, представляваща разнообразие от свързани обекти, използвани при разработването на приложни програми. Пример за такава библиотека е Turbo Vision, обектна библиотека за разработване на текстови интерфейси в системата DOS.

В Turbo Pascal, за да декларирате даден обект като наследник на някакъв предшестващ обект, трябва да посочите името на предшестващия обект в скоби след ключовата дума object. В този случай в описанието на дъщерния обект са посочени само допълнителни полета и методи, които отсъстват от предшественика (или предците). Например:

тип линия = обект (точка);

процедура get_line(var x1,y1,x2,y2:integer) ;

За екземпляри на обекти Line са налични всички полета и методи на обекта point, както и координатните полета на втората точка (Xe и Ye), както и методите set_line и get_line.

Операторът за присвояване може да се използва за обмен на информация между свързани обекти. Допуска се обаче само еднопосочен обмен - от потомък към прародител. Например, ако декларирате L1 като екземпляр на обект Line, тогаваприсвояването на формата p1:=L1; но не и обратното.

В редица случаи, когато създавате наследствени обекти, е важно не само да допълвате полета и методи с нови, но и да „замените“ старите методи, въведени в предците. Това е възможно, защото Turbo Pascal обектите са надарени със свойството полиморфизъм.

Полиморфизмът е способността да се именуват различни процедури (или функции) с едно и също име. Тази възможност не е чужда на много естествени операции. Достатъчно е да си припомним операцията +, която в Turbo Pascal може да означава събиране на цели числа, и събиране на реални числа, и конкатенация на низове, и обединяване на множества. Полиморфизмът може да се използва за всякакви методи на обекти-потомци, както и за припокриващи се, описани по-рано методи на предци. Терминът "замяна" тук означава замяна на един метод с друг със същото име и евентуално същия набор от параметри. Припокриването може да се извърши по два начина: статично и динамично.

Често се използва конструктор за инициализиране на обект, въпреки че това не е необходимо, за да работи механизмът за отмяна. Конструкторът може да бъде празна процедура като цяло и въпреки това замяната ще продължи да работи правилно, защото действа директно върху заглавката на конструктора. Самият конструктор не може да бъде виртуален метод.

4. Пример за програма, използваща обекти.

Програмата, използваща обекти в Turbo Pascal, е изградена като демонстрация на работата на кода с коригиране на грешка в един символ на съобщението (код на Hammynga). Тази програма използва два модула: модул fbyte (подобен на модула f_byte, разгледан по-рано) и модула cod_Hem, съдържащ обекти: символ и низ от символи (Tsymb и Tstr_symb). Програмата изглежда така:

използва CRT, Cod _ Hem, Fbyte;

варmsg:низ[22];

BEGIN TextColor (Жълто); TextBackground (бял); ClrScr ; writeln('Изходен низ:');