русс | укр

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

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


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


Віртуальні методи


Дата додавання: 2015-01-08; переглядів: 1337.


 

Для позначення віртуальних функцій використовується ключове слово virtual. Воно записується в заголовку методу базового класу, наприклад:

 

virtual public void Passport( )

 

Слово virtual в перекладі з англійського означає "фактичний". Оголошення методу віртуальним означає, що всі посилання на цей метод вирішуватимуться за фактом його виклику, тобто не на стадії компіляції, а під час виконання програми. Цей механізм називається пізнім зв’язуванням.

Для його реалізації необхідно, щоб адреси віртуальних методів зберігалися там, де ними можна буде у будь-який момент скористатися. Компілятор формує для цих методів таблицю віртуальних методів (Virtual Method Table, VMT) . У цю таблицю записуються адреси віртуальних методів (зокрема успадкованих) в порядку опису в класі. Для кожного класу створюється одна таблиця.

Кожен об'єкт під час виконання повинен мати доступ до VMT. Забезпечення цього зв'язку не можна доручити компілятору, оскільки він повинен встановлюватися під час виконання програми при створенні об'єкту. Тому зв'язок екземпляра об'єкту з VMT встановлюється за допомогою спеціального коду, що автоматично поміщається компілятором в конструктор об'єкту.

Якщо в похідному класі потрібно перевизначити віртуальний метод, використовується ключове слово override, наприклад:

 

override public void Passport( )

 

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

 

Додамо в лістинг 8.2 два чарівні слова - virtual і override - в описи методів Passport, відповідно, базового і похідного класів (лістинг 8.3).

 

Лістинг 8.3. Віртуальні методи

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace examp49

{

class Monster

{

...

virtual public void Passport()

{

Console.WriteLine(

"Monster {0} \t health = {1} ammo = {2}",

name, health, ammo);

}

 

protected string name; // закриті поля

public int health, ammo;

}

 

class Daemon : Monster

{

override public void Passport()

{

Console.WriteLine(

"Daemon {0} \t health = {1} ammo = {2} brain = {3}", name, health, ammo, brain);

}

class Classl

{

static void Main()

{

const int n = 3;

Monster[] stado = new Monster[n];

stado[0] = new Monster("Monia");

stado[1] = new Monster("Monk");

stado[2] = new Daemon("Dimon", 3);

foreach (Monster elem in stado) elem.Passport();

for (int i = 0; i < n; ++i) stado[i].ammo = 0;

Console.WriteLine();

foreach (Monster elem in stado) elem.Passport();

}

}

}

 

Результат роботи програми:

Monster Monia health = 100 ammo = 100

Monster Monk health = 100 ammo = 100

Daemon Dimon health = 100 ammo = 100 brain = 3

 

Monster Monia health = 100 ammo = 0

Monster Monk health = 100 ammo = 0

Daemon Dimon health = 100 ammo = 0 brain = 3

 

Віртуальні методи базового класу визначають інтерфейс всієї ієрархії. Цей інтерфейс може розширюватися в нащадках за рахунок додавання нових віртуальних методів.

Виклик віртуального методу виконується так: з об'єкту береться адреса його таблиці VMT, з VMT вибирається адреса методу, а потім управління передається цьому методу. Таким чином, при використанні віртуальних методів зі всіх однойменних методів ієрархії завжди вибирається той, який відповідає фактичному типу об'єкту, що викликав його.

Виклик віртуального методу, на відміну від звичайного, виконується через додатковий етап отримання адреси методу з таблиці VMT, що декілька уповільнює виконання програми.

За допомогою віртуальних методів реалізується один з основних принципів об'єктно-орієнтованого програмування - поліморфізм. Це слово в перекладі з грецького означає "багато форм", що в даному випадку означає "один виклик - багато методів". Застосування віртуальних методів забезпечує гнучкість і можливість розширення функціональності класу.

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

При описі класів рекомендується визначати як віртуальних ті методи, які в похідних класах повинні реалізовуватися по-іншому. Якщо у всіх класах ієрархії метод виконуватиметься однаково, його краще визначити як звичайний метод.

 


<== попередня лекція | наступна лекція ==>
Спадкоємство | Абстрактні класи


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