Назад Уперед Зміст

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

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

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

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

За рахунок чого досягається поліморфізм

В основі поліморфізму для сімейства класів, лежать три механізми:

  1. Однобічне присвоювання об'єктів усередині сімейства класів. Об'єкту з батьківського класу можна привласнити дочірній об'єкт. Навпаки не можна.
    // описуємо змінну t 
    // батьківського класу
            Triangle t;
    // створюємо об'єкт t  дочірнього класу і  
    // привласнюємо його  змінної 
    // батьківського  класу
            t= new Equilateral(x);
    
  2. Перевизначення потомком методу, успадкованого від батька. У батьківському класі цей метод відзначається як віртуальний. Потомок, що перевизначає віртуальний метод, зберігає сигнатуру методу. Він, змінює реалізацію методу, але не форму його виклику.
    // метод буде перевизначатися в дочірньому класі, 
    // тому в батьківському вказується virtual
            virtual public double Sqr()
    // у дочірньому класі  переобумовлений метод
    // вказується зі специфікацією override
            override public double Sqr()
    
  3. Динамічне зв'язування, дозволяє в момент виконання, коли вже відомо, який тип об'єкта, викликати метод, що належить об'єкту.
    // описуємо змінну t батьківського класу
             Triangle t;
    // можна створити об'єкт t дочірнього класу 
    	t= new Equilateral(x, y, z);   
    // або об'єкт t батьківського класу
    	t= new Triangle (x, y, z); 
    // при звертанні до віртуального методу Sqr, 
    // він буде викликатися з того класу до якого
    // належить об'єкт 
             s = t.Sqr();
    

Приклад віртуального методу

Створимо клас Trapezoid, що описує трапецію по чотирьом сторонам. Цей клас буде батьківським.

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

Створимо дочірній клас Isoscelesl, що описує рівнобедрену трапецію по її підставах і бічній стороні.

Допустимо, ми прагнемо для рівнобічних трапецій по-іншому обчислювати площу.

Зробимо новий клас Isoscelesl потомком класу Trapezoid і зробимо метод Sqr (обчислення площі) віртуальним.

Нехай у дочірньому класі буде ще свій метод, що обчислює радіус уписаної окружності.

Опис батьківського класу звичайних трапецій

Опис дочірнього класу рівнобічних трапецій

Метод Main класу Program

Для того щоб викликати власний метод Radius з дочірнього класу, крім об'єкта t, довелося створити ще один об'єкт t1 дочірнього класу і застосувати до нього цей метод. Це довелося зробити тому, що змінна t у нас оголошена як Trapezoid, а в цьому класі немає методу Radius.

Відпрацьовування для рівнобічної трапеції

Відпрацьовування для звичайної трапеції

Назад Уперед Зміст