Методи та їх успадковування, поліморфізм 


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



ЗНАЕТЕ ЛИ ВЫ?

Методи та їх успадковування, поліморфізм



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

У Delphi існує чотири види методів: статичні, віртуальні, динамічні та абстрактні.

За замовчуванням всі методи є статичними. Якщо у класі-спадкоємці перевизначити такий метод (тобто ввести новий метод з таким самим іменем), то для об’єктів цього класу новий метод відмінить батьківський. Якщо звернутитися до об’єкту цього класу, то буде викликатися новий метод. Але коли звернутися до об’єкта як до об’єкта батьківського класу, то викличеться батьківський метод.

Віртуальні та динамічні методи не зв’язані з іншими методами з тим же іменем у класах-спадкоємцях. Якщо у класах-спадкоємцях ці методи перезавантажені, то при звертанні до такого методу під час виконання буде викликатися той з методів з однаковими іменами, який відповідає класу об’єкта, вказаному при виклику. Наприклад, якщо є базовий клас графічних об’єктів TShape (геометрична фігура) і ряд його класів-спадкоємців різних геометричних фігур і в кожному з цих класів визначений свій віртуальний метод Draw,  що малює цю геометричну фігуру, то можна написати в програмі:

var ShapeArray: array[1..10] of TShape;

for i:=1 to 10 do ShapeArray[i].Draw;

В цьому коді в масив ShapeArray можуть поміщатися об’єкти різних класів, які є спадкоємцями TShape. В циклі звертання до об’єктів відбувається як до об’єктів базового для них типу TShape. В цьому випадку для кожного об’єкта буде викликатися віртуальний метод Draw саме цього об’єкта. Такий підхід, що полегшує роботу з багатьма спорідненими класами, називається поліморфізмом.

При оголошенні в класі віртуальних і динамічних методів використовуються ключові слова virtual і dynamic.

Щоб перезавантажити у класі-спадкоємцю віртуальний метод, потрібно після його оголошення поставити ключове слово override.

Якщо у якомусь базовому класі метод був оголошений як віртуальний, то він залишається віртуальним у класах-спадкоємцях будь-якого рівня. Тобто, на відміну від знайомого нам Pascal-ю, повторно оголошення virtual писати не потрібно. Однак звичайно для полегшення розуміння кодів перезавантажені методи прийнято повторно оголошувати віртуальними, щоб їх суть була зрозуміла для розробників спадкоємців даного класу. Наприклад:

procedue Draw;override;virtual;

Динамічні методи описуються за допомогою ключового слова dynamic і їх призначення таке саме, як і в Pascal-і, тобто вони відрізняються від віртуальних лише за внутрішнім механізмом їх викликів. В цілому віртуальні методи забезпечують зручніші механізми поліморфізму, а динамічні зручніші, якщо у базовому класі визначено багато перезавантажуваних методів і вони одночасно використовуються багатьма об’єктами класів-спадкоємців.

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

Оголошується абстрактний метод за допомогою ключового слова abstract після слова virtual чи dynamic. Наприклад

procedure DoSomething; virtual; abstract;

Будь-який метод – і статичний і віртуальний – може бути перезавантажений за допомогою ключового слова override. Для віртуальних методів у цьому випадку треба ще додати слово reintroduce. Якщо перезавантажені таким способом методи відрізняються числом чи типом параметрів (так званою сигнатурою), то при виклику методу з класу-спадкоємця буде викликатися той метод, список параметрів якого відповідає списку аргументів.

При реалізації методу, перевизначеного будь-яким способом у класі-спадкоємці, можна викликати метод батьківського класу. Для цього перед іменем методу при його виклику записується ключове слово inherited.

Якщо записати слово inherited і після нього не писати імені викликаного методу, то буде викликатися успадкований метод з таким самим іменем, як і метод, що з нього він викликається.

 

Конструктори і деструктори

Конструктори – це спеціальні методи, які створюють та ініціалізують об’єкт. Об’єкт створюється виділенням для нього області в динамічно розподіленій пам’яті. Оголошення конструктора виглядає так само, як і оголошення процедури, але починаються ключовим словом constructor. В якості імені конструктора звичайно задають ім’я Create. Часто в конструктор передають в якості параметра власника об’єкту. Власник об’єкту Owner – це той об’єкт, при знищенні якого знищується і даний об’єкт. Приклади оголошення конструкторів:

constructor Create;

constructor Create(Owner:TComponent);

 

При реалізації конструктора звичайно першим йде виклик успадкованого конструктора за допомогою ключового слова inherited. В результаті ініціалізуються всі успадковані поля. При цьому порядковим типам в якості початкового значення задається 0, вказівникам – nil, рядки задаються порожніми, а поля типу Variant – Unassigned. Потім ініціалізуються нові поля, введені в даному класі.

Деструктори – це спеціальні методи, які знищують об’єкт і вивільняють зайняту ним пам’ять. Оголошення деструктора виглядає так само, як оголошення процедури, але починається ключовим словом destructor. В якості імені деструктора звичайно задають ім’я Destroy.  Реалізація деструктора як правило завершується викликом успадкованого деструктора за допомогою ключового слова inherited, щоб вивільнити пам’ять, виділену для успадкованих полів.

 

Події

Подія – це спеціальна властивість, що є вказівником функції. Тип узагальненого вказівника на функцію, якій передається один параметр типу TObject – TNotifyEvent. Приклади подій – OnClick, FormCreate, FormClose, OnMouseMove.

 

Приклад реально оголошеного класу (Програма 8.1)

type

TEditBukwa = class(TEdit)

private

{ Private declarations }

FClear:TNotifyEvent;

FEnableBukwa:boolean;

FEnableLet:boolean;

FModified:boolean;

protected

{ Protected declarations }

procedure SetEnableBukwa(Value:boolean);

procedure SetEnableLet(Value:boolean);

procedure KeyPress(var Key:Char);override;

public

{ Public declarations }

property Modified:boolean read FModified default true;

constructor create(AOwner:TComponent);override; //конструктор

procedure Clear;override;

published

{ Published declarations }

property OnClear:TNotifyEvent read FClear write FClear;

property EnableBukwa:boolean read FEnableBukwa write SetEnableBukwa default true;

property EnableLet:boolean read FEnableLet write SetEnableLet default true;

 

end;

Програма 8.1

Підсумок

Delphi успадковує всі можливості роботи з об’єктами, які існують у Pascal-і, але, водночас, має багато нових можливостей. Об’єкт у Delphi – це сукупність властивостей, методів і подій, на які він може реагувати. Об’єктний тип називається класом. Рівень доступності/захищеності елементів класу визначається одним з чотирьох ключових слів: public, published, protected, private. При описі нового класу можна додавати нові методи і властивості, залишаючи методи і властивості батьківського класу, а можна батьківські методи і властивості перевизначити. У Delphi існує чотири види методів: статичні, віртуальні, динамічні та абстрактні. Спеціальні типи методів для створення і видалення об’єктів – конструктори і деструктори.  Важливою характеристикою об’єкту є події, на які він реагує (клацання мишкою, натиск клавіші Ввід і т.д.)

 

Питання по темі

1. Яке ключове слово входить до опису об’єктного типу в Delphi?

а) class

б) object

в) ClassOfObject

2. Як називається найзагальніший з напередвизначених класів (TObject)

3. Рівень доступності/захищеності елементів класу визначається одним з ключових слів:

а) public, published, protected, private

б) public, private

в) private

4. Стандартні імена для конструкторів та деструкторів у Delphi

а) Init; Done

б) Create; Destroy

в) Constructor; Destructor

 

5. Різновиди методів у Delphi

а) статичні, віртуальні, динамічні та абстрактні.

б) статичні, віртуальні, динамічні

в) статичні, віртуальні, дружні

 



Поделиться:


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

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