русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


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


Дата додавання: 2014-04-22; переглядів: 1133.


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

У 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і після нього не писати імені викликаного методу, то буде викликатися успадкований метод з таким самим іменем, як і метод, що з нього він викликається.

 


<== попередня лекція | наступна лекція ==>
Властивості | Конструктори і деструктори


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн