Класи і об'єкти в object pascal

Назва роботи: Класи і об'єкти в Object Pascal

Предметна область: Інформатика, кібернетика та програмування

Опис: Класи і об'єкти Класами в Object Pascal називаються спеціальні типи, які містять поля, методи і властивості. Як і будь-який інший тип, клас служить лише зразком для створення конкретних екземплярів реалізації, які називаються об'єктами. Відразу ж.

Розмір файлу: 82.5 KB

Роботу скачали: 50 чол.

Класами в Object Pascal називаються спеціальні типи, які містять поля, методи і властивості. Як і будь-який інший тип, клас служить лише зразком для створення конкретних екземплярів реалізації, які називаються об'єктами. Відразу ж уточню, що в попереднику Object Pascal - Turbo Pascal об'єктами називаються типи, що мають багато спільного з класами Object Pascal. Однак су? Істотні удосконалення, внесені в об'єктну модель Object Pascal, змусили розробників мови ввести для Позначений? Ня об'єктів спеціальний термін - клас, запозичений, до речі, з С ++. Для сумісності з раніше розробленими програмами системи Turbo Pascal with Objects 7.0 в Object Pascal збережений тип-об'єкт Object, що підтримує «стару» об'єктну модель. За? Скільки всі можливості цієї моделі доступні класах, ми не будемо розглядати її, а «звільнився» термін об'єкт будемо вживати виключно для позначення конкретного ек? Земпляра реалізації класу.

Важливою відмінністю класів від інших типів є те, що об'єк? Єкти класу завжди розподіляються в купі, тому об'єкт-змінна фактично являє собою лише покажчик на ді? Наміческіх область пам'яті. Однак, на відміну від інших указат? Лей, при посиланні на вміст об'єкта забороняється використовувати символ «^» за ім'ям об'єкта:

MyClass ^ .Field: = 0; // Помилка. Слід писати так:

ОСНОВНІ ПОНЯТТЯ

Класи - це особливе «винахід» програмістів для спрощена? Ня розробки складних програм і поліпшення їх якості. В ос? Нове класів лежать три фундаментальних принципи, які називаються? Вають інкапсуляція, успадкування і поліморфізм.

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

Інкапсуляція є потужний засіб обміну гото? Вимі до роботи програмними заготовками. Бібліотека класів Delphi - це, фактично, набір «цеглинок», створених програм? Місті Borland для побудови ваших програм.

спадкування

Породжений клас автоматично успадковує поля, методи і властивості свого батька і може їх додавати новими. Таким об? Разом, принцип успадкування забезпечує поетапне створення складних класів і розробку власних бібліотек класів.

Принцип успадкування призводить до створення розгалужених дерева класів, поступово розростається при переміщенні від TObject до його нащадкам. Кожен нащадок доповнює можливості свого ро? Дителя новими і передає їх своїм нащадкам.

Для прикладу на рис. 1 показаний невеликий фрагмент дерева класів Delphi. Клас TPersistent збагачує можливості свого ро? Дителя TObject: він «уміє» зберігати дані у файлі і отримувати їх з нього, в результаті це вміють робити і все його нащадки. Клас TComponent, в свою чергу, вміє взаємодіяти з середовищем розробника і передає це вміння своїм нащадкам. TControl не тільки здатний працювати з файлами і середовищем розробника, але він ще вміє створювати і обслуговувати видимі на екрані изображе? Ня, а його нащадок TWinControl може створювати Windows-вікна і т.д.

Класи і об'єкти в object pascal

Мал. 1. Фрагмент дерева класів Object Pascal

поліморфізм

Поліморфізм - це властивість класів вирішувати схожі за змістом проблеми різними способами. В рамках Object Pascal поведенч? Ські властивості класу визначаються набором вхідних в нього мето? Дов. Змінюючи алгоритм того чи іншого методу в нащадках класу, програміст може надавати цим нащадкам відсутні у ро? Дителя специфічні властивості. Для зміни методу необхідно перекрити його в нащадку, тобто оголосити в нащадку однойменний ме? тод і реалізувати в ньому потрібні дії. В результаті в об'єкті-батьку і об'єкті-нащадку будуть діяти два однойменних методу, мають різну алгоритмічну основу і, отже, надають об'єктам різні властивості. Це і називається полімор? Фізмен об'єктів.

У Object Pascal поліморфізм досягається не тільки описаним вище механізмом успадкування і перекриття методів батька, але і їх виртуализацией (див. Нижче), що дозволяє батьківським мето? Дам звертатися до методів своїх нащадків.

Полями називаються інкапсульовані в класі дані. Поля можуть бути будь-якого типу, в тому числі - класами, наприклад:

Кожен об'єкт отримує унікальний набір полів, але загальний для всіх об'єктів даного класу набір методів і властивостей. Фундаментів? Тальний принцип інкапсуляції вимагає звертатися до полів тільки за допомогою методів і властивостей класу. Однак в Object Pascal разре? Шается звертатися до полів і безпосередньо. Для цього використовуються складові імена полів, що містять ім'я об'єкта в якості пре? Фікса:

aObject.aStrField: = 'Рядок символів';

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

Інкапсульовані в класі процедури і функції називаються методами. Вони оголошуються так само, як і звичайні підпрограми:

function MyFunc (aPar: Integer): Integer;

Доступ до методів класу, як і до його полях, можливий за допомогою складових імен:

Як вже говорилося, методи класу можуть перекриватися в по? Томко. наприклад:

Нащадки обох класів можуть виконувати подібну за назвою процедуру DoWork. але, в загальному випадку, будуть це робити по-різному. Таке заміщення методів називається статичним, тому що реалізується компілятором.

Нехай, наприклад, батьківський клас за допомогою методів Show і Hide відповідно показує щось на екрані або ховає з? Браженіе. Для створення зображення він використовує метод Draw з логічним параметром:

procedure Draw (IsShow: Boolean); virtual;

procedure Draw (IsShow: Boolean); override;

Реалізація методів Show і Hide дуже проста:

Методи Draw у батька і нащадка мають різну реалізацію і створюють різні зображення. В результаті батьківські методи Show і Hide будуть ховати або показувати ті чи інші зображення в залежності від конкретної реалізації методу Draw у будь-якого зі своїх нащадків. Динамічне зв'язування в повній мірі реалізує поліморфізм класів.

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

procedure Draw (IsShow: Boolean); virtual; abstract;

procedure Draw (IsShow: Boolean); override;

aVisualObject.Show; // Помилка! Звернення до абстрактного методу

aVisualChild.Show; // Нормальне звернення. Метод Draw у класу

Виклик не перекритого абстрактного методу викликає помилку пе? Періоди виконання. Зрозуміло, в грамотно складеній програмі абстрактні методи ніколи не викликаються. Класи, що містять абстрактні методи, називаються абстрактними. Такі класи ін? Капсуліруют загальні властивості своїх неабстрактне нащадків, але об'єкти абстрактних класів ніколи не створюються і не вико? Ються. Для експлуатації абстрактних класів в бібліотеку класів Delphi включаються класи-нащадки, в яких перекриваються аб? Страктние методи батька.

Constructor Create (Value: Integer);

Будь-які поля об'єкта, а також методи класу, які оперують з його полями, можуть викликатися тільки після створення об'єкта за допомогою на? Гою виклику конструктора, тому що конструктори розподіляють об'єкт в динамічної пам'яті і роблять дійсним міститься в об'єкті покажчик.

MyObject.IntField: = 0; // Помилка! Об'єкт не створений конструктором!

MyObject: = TMyClass.Create; // Треба так: створюємо об'єкт

MyObject.IntField: = 0; // і звертаємося до його полю.

MyObect.Free; // Уничтожаем непотрібний об'єкт

Більшість конструкторів реалізують деякі дії, нє? Обхідні для правильної роботи об'єкта. Тому в конструкторська? Ре класу-нащадка слід спочатку викликати конструктор свого ро? Дителя, а вже потім здійснювати додаткові дії. Виклик будь-якого перекритого методу батьківського класу досягається за допомогою зарезервованого слова Inherited (успадкований).

Constructor TMyClass.Create (Value: Integer);

// Можлива реалізація конструктора

Inherited Create; // Викликаємо успадкований конструктор

IntField: = Value; // Реалізуємо додаткові дії

Деякі методи можуть викликатися без створення і ініціації об'єкта. Такі методи називаються методами класу, вони оголошені? Ються за допомогою зарезервованого слова class:

class function GetClassName: String;

function GetField: Integer;

procedure SetField (Value: Integer);

Property IntegerValue: Integer read GetField write SetField;

У контексті програми властивість поводиться як звичайне поле. Наприклад, ми могли б написати такі оператори:

aClass: = TaClass.Create;

перед зверненням до поля або властивості!>

aClass.Destroy; // Видалення непотрібного об'єкта

Більш того, можливий і такий оператор присвоювання:

Різниця між цим оператором і оператором

полягає в тому, що при зверненні до властивості автоматично підключається метод SetField, в якому можуть реалізовуватися спе? ціфічние дії.

Приклад: розглянемо наступний оператор

Властивість Caption компонента Label викликає метод SetText, який не тільки запам'ятовує рядок символів у внутрішній змінної, але і здійснює промальовування мітки з новим текстом.

Якщо немає необхідності в спеціальних діях при читанні або запису властивості, замість імені відповідного методу можна вказувати ім'я поля:

procedure SetField (Value: Integer);

Property IntegerValue: Integer read IntFiled write SetField;

Якщо необхідно, щоб поле було доступно тільки для чте? Ня або тільки для запису, слід опустити відповідно частина write або read. Взагалі кажучи, властивість може і не зв'язку? Тися з полем. Фактично воно описує один або два методи, які здійснюють деякі дії над даними того ж типу, що і властивість.

Будь новостворюваний клас містить чотири секції, визна? Ділячи зарезервованими словами published (декларовані), private (особисті), protected (захищені) і public (доступні). Усередині кожної секції спочатку визначаються поля, а потім - методи і властивості.

Наступний фрагмент коду пояснює області видимості.

Uses Controls, Forms;

Buttonl: TButton; // Ця секція обслуговується Delphi

// Її елементи доступні всім

private // Ця секція доступна в модулі Unit1

procedure SetValue (Value: Integer);

function GetValue: Integer;

published // Ця секція доступна в будь-якому модулі

Property IntField: read GetValue write SetValue;

protected // Ця секція доступна класам-нащадкам

public // Ця секція доступна в будь-якому модулі

Схожі статті