
- •12.1. Класи й об’єкти. Основні поняття
- •12.2.Опис класів і об’єктів
- •12.3. Складові класів
- •12.4. Поняття успадкування
- •12.4. Поліморфізм. Віртуальні та динамічні методи
- •12.5. Структура опису класу
- •13. Класи загального призначення
- •13.1. Клас exception –- обробки виключень
- •13.2. Клас tlist – списки
- •13.3. Класи tstrings, tstringlist – набори рядків й об’єктів
Об’єктно-зорієнтоване програмування
Дисципліна програмування стрімко почала розвиватись як наука з кінця 40 – х років 20 століття. За роки свого становлення і розвитку програмування пройшло ряд етапів розробки програмних засобів.
На початку програмування різних задач здійснювалося у машинних кодах. З часом була розроблена концепція підпрограм. Підпрограма це спеціальним чином оформлена логічно завершена частина програми до якої можна звертатися з будь-якої точки програми будь-яку кількість разів з різними параметрами. Тоді у програмуванні почали створюватись і використовуватись бібліотеки підпрограм.
Черговим етапом у програмуванні стає автоматизація розробки програм. Починають використовуватися алгоритмічні мови та транслятори (компіляторами та інтерпретатори) з цих мов. Також появляється ідеологія модульного і структурного програмування. При модульному програмуванні здійснюється алгоритмічна декомпозиція задачі на окремі модулі Рис. 12.1. Кожний модуль вибирає із загального сховища дані обробляє їх і повертає результат обробки назад у сховище.
Рис. 12.1. Модульне програмування
Структурне програмування визначає порядок розробки модулів. Розрізняють програмування знизу у вверх і зверху в низ. При програмуванні знизу у вверх спочатку розробляються окремі модулі, а потім вони зв’язуються в єдину програму, при цьому ряд проблем несумісності по даних і ряд модулів приходиться переписувати заново. При програмуванні зверху у низ вимагається повна інформація про початкові дані і результати, а це вимагає високої кваліфікації розробників проекту.
Наступним етапом стало візуальне проектування програмних засобів основою якого є об’єктно-зорієнтоване програмування. При об’єктно-зорієнтованому програмуванні декомпозиція задачі здійснюється як по алгоритмах так і по даних. Основним поняттям об’єктно-зорієнтованого програмування є клас, який містить дані і програми їх обробки. В результаті клас несе в собі деяку функціональність. Бібліотека класів Delphi – це фактично, набір “цеглинок” для побудови програм.
12.1. Класи й об’єкти. Основні поняття
Класами в Object Pascal називаються спеціальні типи, які включають поля, методи й властивості. Як і будь-який інший тип, клас є лише зразком для створення конкретних екземплярів реалізації, які називаються об'єктами.
Важливою відмінністю класів від інших типів є те, що об’єкти класу завжди розподіляються в динамічній пам’яті, тому об'єкт-змінна фактично є покажчиком на динамічну область пам'яті. Однак, на відміну від інших вказівників, при посиланні на вміст об'єкта забороняється використати символ «^» за ім'ям об'єкта:
type
TClass = class(TObject)
Field: Integer;
end;
var
MyClass: TClass;
Begin
. . . . . .
MyClass^.Field := 0; // Помилка!
MyClass.Field := 0; // Слід писати
. . . . . .
end;
В основі класів лежать три фундаментальних принципи інкапсуляція, успадкування і поліморфізм.
Інкапсуляція. Клас це єдність трьох сутностей - полів, методів і властивостей. Об'єднання цих сутностей у єдине ціле й називається інкапсуляцією. Інкапсуляція дозволяє багато в чому ізолювати клас від інших частин програми, зробити його «самодостатнім» для розв’язування конкретних задач. У результаті клас завжди несе в собі деяку функціональність. Наприклад, клас TForm інкапсулює у собі все необхідне для створення Windows-вікна., клас TMemo є повно функціональним текстовим редактором, клас TTimer забезпечує роботу програми з таймером і т.д.
Інкапсуляція є потужнім засобом розробки програмних засобів.
Успадкування. Будь-який клас може бути породжений від іншого класу. Для цього при його оголошенні вказується ім'я класу-батька:
Type TPerson=class Type TMan=class(TPerson)
Pib:string[30]; Pos:string[15];
Rn:word; Zp:real;
Procedure ReadP; . . . . . . .
Procedure WriteP;
end; end;
TPerson це батьківський клас, а TMan породжений клас. Породжений клас автоматично успадковує поля, методи й властивості свого батька й може доповнювати їх новими. Таким чином, клас TMan містить всі поля і методи класу TPerson і доповнює їх полями Pos і Zp. Принцип успадкування забезпечує поетапне створення складних класів і розробку власних бібліотек класів.
Всі класи Object Pascal породжені від єдиного батька-класу TObject. Цей клас не має полів і властивостей, але містить у собі методи самого загального призначення, що забезпечують весь життєвий цикл будь-яких об'єктів – від їхнього створення до знищення. Програміст не може створити клас, що не був би дочірнім класом TObject. Наступні два оголошення ідентичні:
TaClass = class(TObject)
TaClass = class
Принцип успадкування приводить до створення ієрархічного дерева класів, що поступово розростається при переміщенні від TObject до його нащадків. Кожен нащадок доповнює можливості свого батька новими й передає їх своїм нащадкам.
TWinControl
Рис. 12.2. Фрагмент дерева класів Object Pascal
На Рис. 12.2. наведено фрагмент дерева класів Delphi. Клас TPersistent збагачує можливості свого батька TObject: він «уміє» зберігати дані у файлі й одержувати їх з нього, у результаті це вміють робити й всі його нащадки. Клас TComponent, у свою чергу, уміє взаємодіяти із середовищем розроблювача й передає це вміння своїм нащадкам. TControl не тільки здатний працювати з файлами й середовищем розроблювача, але він ще вміє створювати й обслуговувати видимі на екрані зображення, а його нащадок TWinControl може створювати Windows-вікна, і т.д.
Поліморфізм. Поліморфізм - це властивість класів вирішувати схожі за змістом проблеми різними способами. У рамках Object Pascal властивості класу визначаються набором його методів. Змінюючи алгоритм того або іншого методу в нащадках класу, програміст може надавати цим нащадкам відсутні в батька специфічні властивості. Для зміни методу необхідно перекрити його в нащадку, тобто оголосити в нащадку однойменний метод і реалізувати в ньому потрібні дії. У результаті в об'єкті-батька й об'єкті-нащадка будуть діяти два однойменних методи, що мають різну алгоритмічну основу й, отже, різні властивості, що надаються об'єктам. Це й називається поліморфізмом об'єктів.
В Object Pascal поліморфізм досягається не тільки механізмами спадкування й перекриття методів батька, але і їх віртуалізацією, що дозволяє батьківським методам звертатися до методів своїх нащадків.