Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_Паскал.doc
Скачиваний:
2
Добавлен:
21.09.2019
Размер:
1.21 Mб
Скачать

Об’єктно-орієнтоване програмування. Що таке об’єктно-орієнтоване програмування

Об’єктно- орієнтоване програмування (ООП)— більш прогресивний метод проектування програм, у порівнянні зі структурним програмуванням, з яким ми дотепер мали справу. На певному етапі розвитку науки про програмування прийшло розуміння, що всяку складну задачу для полегшення її рішення корисно розділити на прості підзадачи. Ідея полягала у тім, щоб програма складалася не з величезного числа операторів, а з набору відносно самостійних частин (підпрограм), кожній з який призначена окрема, порівняно вузька роль. Підпрограми позбавили програмістів від необхідності вникати в подробиці реалізації найпростіших задач; після того як відповідна підпрограма створена, нею можна користатися, не знаючи, як вона устроєна. Необхідно тільки бути в курсі, що робить та або інша процедура чи функція.

Пізніше ідея структурування програм одержала подальший розвиток. Мова йде про концепцію модулів. Модуль— це файл який компілюється Turbo Pascal, і у якому можуть міститися описи констант, типів даних, змінних, а також процедур і функцій.

Отож, ООП — це результат природної еволюції більш ранніх методологій програмування. Подібно тому, як підпрограми надають програмісту можливість не вникати в подробиці реалізації найпростіших задач, об'єкти дозволяють маніпулювати даними, не знаючи, як ці дані організовані.

Необхідно відзначити, що объектно-ориентироване програмування— це не для простих програм, що виконують нескладні розрахунки. Якщо в подібному випадку застосувати методи ООП, така програма буде виглядати перевантаженою зайвими мовними конструкціями. Якщо ж створювана програма досить об'ємна, засоби ООП виявляються дуже і дуже до речі.

В основі объектно-ориентированного програмування лежать три основних принципи: інкапсуляція, спадкування і поліморфізм. З зазначеними принципами ми познайомимося нижче.

Інкапсуляція

Опис об'єкта (як і всіх інших типів) повиний міститися в розділі описів. Дані, що містить об'єкт, називаються nолями об'єкта. Опис найпростішого об'єктного типу дуже схожий на опис запису, тільки замість одного зарезервованого слова (RECORD) використовується інше (OBJECT), наприклад:

type

Dot = object

a, b : integer;

end;

Цей об'єктний тип, що містить два поля, являє собою точку на екрані з координатами А и В.

Як уже відзначалося, крім даних у виді полів (які можуть належати будь-якому типу, у тому числі й об'єктному), об'єкт також може містити підпрограми, що описують дії, припустимі над цими полями. Такі підпрограми називаються методами. Метод має доступ до полів об'єкта, не потребуючи передачі їх йому як параметрів. Властивість об'єктів, містити в собі не тільки дані (поля), але й описи дій, припустимих над цими даними (методи), називається інкапсуляцією.

При цьому безпосередньо в описі об'єкта присутні тільки заголовки підпрограм, а тіло кожної підпрограми задається окремо. Повернемося до типу Dot з попереднього приклада. От як виглядає опис цього об'єктного типу, доповнений необхідними методами (описи полів завжди повинні передувати заголовкам методів):

Dot=object

a, b :integer;

procedure Init (x,y:integer);

procedure Show;

procedure Hide;

procedure Move (Da,Db: integer)

end;

procedure Dot.Init;

begin

a:=x;b:=y;

end;

procedure Dot.Show;

begin

PutPixel(a,b,White);

end;

procedure Dot.Hide;

begin

PutPixel(a,b,Black);

end;

procedure Dot.Move;

begin

Hide;

a:=a+Da; b:=b+Db;

Show

end;

У цьому прикладі об'єкт містить чотири методи. Метод Init инициализирует об'єкт (тобто приcвоює точці на екрані деякі початкові значення). Методи Show і Hide "запалюють" і "гасять" точку на екрані. Нарешті, метод Move переміщає точку по екрані.

Після того як об'єктний тип оголошений, ніщо не заважає створювати змінні цього типу, чи, випливаючи з термінології ООП, екземпляри об'єкта. Це можуть бути як статичні змінні, оголошені в розділі опису змінних, так і динамічні, створені за допомогою стандартної процедури New (про динамічні об'єкти мова йтиме в розділі "Конструктори, динамічні об'єкти і деструктори"). Наприклад:

var Dotl : Dot;

Тут оголошена (статична) змінна Dotl (чи екземпляр об'єкта), що належить типу Dot. Після того як екземпляр об'єкта створений, його поля стають доступні для методів, хоча до полів об'єкта можливий і безпосередній доступ— як до полів запису (цього Turbo Pascal не забороняє). Для того щоб безпосередньо застосувати до поля об'єкта яку-небудь стандартну підпрограму, досить скористатися його складеним ім'ям — вказати ідентифікатор об'єкта і (через крапку) ідентифікатор цього поля. Однак такий підхід був би відступом від принципів об’єктно-орієнтованого програмування (ООП). ООП припускає використання при маніпулюванні полями об'єкта тільки його методів. Наприклад:

Dotl.Init(100,100);

Dotl.Show;

Dotl.Move(50,50);

Так само, як до записів, до об'єктів застосуємо оператор WITH:

with Dotl do

begin

Init(100,100);

Show;

Move(50,50);

end;

Представлені вище послідовності операторів еквівалентні.

Повний текст програми, із фрагментами якої ми тільки що мали справу, представлений нижче. Дана програма відображає на екрані світну крапку (пиксель). Крім того, відображувану крапку можна переміщати по екрані в чотирьох напрямках за допомогою відповідних клавіш - стрілок.

program ObjDot;

uses crt, graph;

type Dot=object

a, b :integer;

procedure Init (x,y:integer);

procedure Show;

procedure Hide;

procedure Move (Da, Db: integer);

end;

procedure Dot.Init;

begin

a:=x; b:=y;

end;

procedure Dot.Show;

begin

PutPixel(a,b,White);

end;

procedure Dot,Hide;

begin

PutPixel(a,b,0);

end;

procedure Dot.Move;

begin

Hide;

a:=a+Da;

b:=b+Db;

Show

end;

var i,j,k,Err : integer;

а : char;

Dotl : Dot;

begin {тіло програми}

i:=detect;

initgraph(i,j,");

Err:=GraphResult;

If Err <> grOK then

WriteLn(GraphErrorMsg(Err))

else begin

Dotl.Init(GetMaxX div 2,GetMaxY div 2)

Dotl.Show;

while KeyPressed do

a:=ReadKey;

repeat begin

a:=ReadKey;

case ord(a) of

72:Dotl.Move(0,-5);

80:Dotl.Move(0,5);

77:Dotl.Move(5,0);

75:Dotl.Move(-5,0);

end;

end;

until а = chr(27);

end;

end.

У програмі оголошений уже знайомий нам об'єкт Dot, що містить два поля: А и В, що визначають положення точки на екрані, а так само чотири методи: Init, Show, Hide і Move.

Далі розташований розділ опису змінних, у якому серед інших змінних оголошений екземпляр об'єкта Dotl. Тіло програми починається з операторів, що забезпечують перехід у графічний режим.

Далі стоїть оператор REPEAT, що виявляє натискання визначеної клавіші. Оператор CASE тут містить чотири варіанти, що відповідають чотирьом клавішам-стрілкам. Кожний зі згаданих варіантів викликає метод Move c фактичними параметрами, що забезпечують переміщення світної точки в потрібному напрямку і на визначену відстань — на п'ять пікселей.

Умовою завершення циклу, організованого за допомогою оператора REPEAT, є натискання клавіші, що генерує скен-код 27 (це клавіша <Esc>). На цьому завершує роботу і вся програма в цілому.