Поняття об’єкта в Delphi та операції з ним 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Поняття об’єкта в Delphi та операції з ним



Згідно із загальними принципами ООП, об’єкт в Delphi – це сукупність даних і способів роботи з ними. Дані можна розглядати як поля запису. Це характеристики об’єкту. До них може належати його назва, підпис, розміри, колір, видимість чи невидимість, особливості розміщення, шрифт та інше. Як користувач, так і інші об’єкти програми повинні мати можливість читати ті дані об’єкта, які є для них доступними, якось їх обробляти і записувати в об’єкт нові значення. При цьому прямий доступ до даних, як правило, заборонений, згідно з принципом інкапсуляції. З об’єктом бажано працювати тільки за допомогою його власних процедур та функцій які називаються методами. Сукупність даних і методів їх читання та запису називається властивістю. Ці властивості можна встановлювати в процесі проектування або міняти програмно під час виконання прикладної програми. В процесі проектування ми можемо бачити значення деяких цих властивостей за допомогою такої структурної частини Delphi як Інспектор Об’єктів (Object Inspector), можемо змінювати ці значення. Але насправді все спілкування з даними відбувається через методи їх читання і запису. Це відбувається і впроцесі проектування, коли середовище проектування запускає в потрібний момент ці методи, і в процесі виконання прикладної програми, оскільки компілятор Delphi незримо для розробника вставляє у потрібних місцях програми виклики цих методів.

Крім методів, що працюють з окремими даними, в об’єкті є методи, що працюють з усією їх сукупністю і міняють їх структуру. Таким чином, об’єкт є сукупністю властивостей і методів. Але це ще не закінчений опис об’єктів, потрібно ще передбачити взаємодію об’єктів між собою.

Середовищем взаємодії об’єктів є повідомлення, що генеруються в результаті різних подій. Події наступають, насамперед, внаслідок різних дій користувача: клацання мишкою, переміщення курсору мишки, натиску на клавішу клавіатури, відкриття чи закриття певних вікон. Але події можуть наступати і внаслідок роботи самих об’єктів. В кожному об’єкті визначено багато подій, на які він може реагувати. В конкретних екземплярах об’єкта можуть бути визначені обробники якихось із цих подій і вони визначають рекцію екземпляра об’єкта. В значній мірі, проектування у Delphi зводиться до написання цих обробників.

Отож, остаточно об’єкт у Delphi – це сукупність властивостей, методів і подій, на які він може реагувати. Зовнішнє управління об’єктом здійснюється через обробники подій. Ці обробники звертаються до методів та властивостей об’єкта. Початкові значення даних об’єкта можуть задаватися також в процесі проектування установкою різних властивостей. В результаті виконання методів об’єкту можуть генеруватися нові події, що сприймаються іншими об’єктами програми чи користувачем.

В процесі роботи об’єкти можуть створюватися і знищуватися. Таким чином, структура програми є динамічним утворенням, що змінюється в процесі виконання. Основна мета створення і знищення об’єктів – економія ресурсів комп’ютера, насамперед, пам’яті, а також досягнення необхідної гнучкості управління.

З метою організації динамічного розподілу пам’яті у всі об’єкти закладені методи їх створення – конструктори і знищення – деструктори. Конструктори об’єктів спрацьовують при запуску програми, деструктори – при її завершенні. Але нерідко в процесі виконанні динамічно створюються і знищуються нові об’єкти.

 

Оголошення класу

Класом у Delphi називається тип даний, оголошений користувачем. Синтаксис оголошення об’єктного класу такий:

Type

<імя класу>= Class {(імя батьківського класу)}

public //доступно всім

<поля, методи, властивості, події>

published //відображаються в Інспекторі Об’єктів і можуть мінятися користувачем

<поля, властивості >

protected //доступ надається тільки потомкам класу

<поля, методи, властивості, події>

private //доступ тільки в модулі

<поля, методи, властивості, події>

end;

Ім’я класу може бути будь-яким допустимом ідентифікатором. Але прийнято ідентифікатори більшості класів починати з символа «Т». Ім’я батьківського класу може не вказуватися. Тоді припускається, що даний клас є безпосереднім спадкоємцем TObject – найзагальнішого з напередвизначених класів. Таким чином, наступні оголошення є еквівалентними:

type TMyClass=class

end;

і

type TMyClass=class(TObject)

end;

Клас успадковує поля, методи, властивості, події від своїх предків і може відміняти чи перевизначати якісь із цих елементів класу або вводити нові. Доступ до оголошуваних елементів класу визначається тим, в якому класі вони оголошені.

Розділ public (відкритий) призначений для оголошень, які доступні для зовнішнього використання. Це відкритий інтерфейс класу. Розділ published (публікований) містить відкриті властивості, які з’являються в процесі проектування на сторінці властивостей Інспектора Об’єктів і які користувач може встановлювати в процесі проектування. Розділ private (закритий) містить оголошення полів, процедур і функцій, що використовуються лише всередині даного класу. Розділ protected (захищений) містить оголошення, доступні лише для потомків оголошуваного класу. Як і у випадку закритих елементів, можна приховати деталі реалізації захищених елементів від кінцевого користувача. Однак, на відміну від закритих, захищені елементи залишаються доступними для програмістів, які захочуть створювати від цього класу похідні об’єкти, причому не вимагається, щоб похідні об’єкти оголошувалися в тому ж модулі.

Оголошення полів виглядають так само, як оголошення змінних чи оголошення полів у записах:

<імя поля>:<тип>;

Оголошення методів у найпростішому випадку теж нічим не відрізняються від звичайних оголошень процедур та функцій.

 

Властивості

Виходячи з принципу інкапсуляції, поля даних завжди мають бути захищеними від несанкціонованого доступу. Доступ до них, як правило, повинен здійснюватися через властивості, що включають методи читання і запису полів. Тому поля доцільно оголошувати в розділі private – закритому розділі класу. Зрідка їх можна поміщати в protected - захищеному розділі класу, щоб можливі потомки даного класу мали до них доступ. Традиційно ідентифікатори     полів співпадають з іменами відповідних властивостей, але з додаванням у якості префікса символа 'F'.

property <ім’я>:<тип> read <ім’я поля чи методу читання> write <ім’я поля чи методу запису> <директиви запам’ятовування>

Якщо в розділах read чи write записане ім’я поля, то передбачається пряме читання чи запис даних.

Якщо в розділі read записане ім’я методу читання, то читання буде здійснюватися лише функцією з цим іменем. Функція читання – це функція без параметру, що повертає значення того типу, який оголошений для властивості. Ім’я функції читання прийнято починати з префіксу Get, після якого йде ім’я властивості.

Якщо в розділі write записане ім’я методу запису, то запис буде здійснюватися лише процедурою з цим іменем. Процедура запису – це процедура з одним параметром того типу, який оголошений для властивості. Ім’я процедури запису прийнято починати з префіксу Set, після якого йде ім’я властивості.

Якщо розділ write відсутній в оголошенні властивості, значить це властивість лише для читання і користувач не може задавати його значення.

Директиви запам’ятовування визначають, як потрібно зберігати значення властивості при збереженні користувачем форми.dfm. Найчастіше використовується директива

default <значення по замовчуванню>

Вона не задає початкових умов, це завдання конструктора. Директива просто оголошує, що якщо користувач в процесі проектування не поміняв значення властивості за замовчуванням, то зберігати значення властивості не потрібно.

Приведемо приклад. Нехай потрібно оголосити клас з іменем MyClas s, що є безпосереднім спадкоємцем TObject і має властивість цілого типу з іменем А. Тоді оголошення цього класу може мати вигляд:

type

MyClass=class(TObject)

private

FA: integer;

protected

procedure SetA(Value:integer); //процедура запису

published

property A: integer read FA write SetA default true;

end;

 

Тут вводиться закрите поле FA, оголошується захищена функція SetA, що використовується для запису значення цього поля, і вводиться опублікована властивість А, яка оперує цим полем. В оголошенні властивості після ключового слова read записане просто ім’я поля. Це означає, що функція читання відсутня і користувач може безпосередньо читати знаення поля. Після ключового слова write йде посилання на функцію запису SetA, за допомогою якої в поле А будуть записуватися нові значення. В цій функції можна передбачити якісь перевірки допустимості введеного значення А.

Опис цієї функції повинен поміщатися в розділ implementati on  модуля, в якому оголошений клас, і може мати вигляд

procedure MyClass.SetA(Value:integer);

begin

if…

then FA:=Value;

end;

В приведеному прикладі опис властивості А поміщений в розділ published. Отже, якщо цей клас описує створений нами новий компонент, то після його встановлення в системі властивість А з’явиться у вінкі Інспекторі Об’єктів при використанні цього компонента. Якщо перенести оголошення властивості в розділ public, то властивістю можна буде користуватися лише під час виконання програми, бо у вікні Інспектора Об’єктів воно не з’явиться. Якщо видалити з означення властивості слово write з наступним посиланням на функцію запису, то властивість стане властивістю тільки для читання, оскільки поміняти її безпосередньо буде неможливо

 



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 62; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 13.58.121.131 (0.013 с.)