Віртуальний метод — метод класу, який може бути перевизначений у класах-спадкоємцях так, що конкретна реалізація методу для виклику буде визначатися під час виконання.
Таким чином, програмісту необов'язково знати точний тип об'єкта для роботи з ним. Досить лише знати, що об'єкт належить класу або спадкоємцеві класу, у якому метод оголошений.
Інтерфейси віртуального методу і усіх його версій повинні повністю збігатися. Таким чином, застосування віртуальних методів дозволяє фіксувати інтерфейс методу і потім розробити під цей інтерфейс нові реалізації.
В основі поліморфізму для сімейства класів, лежать три механізми:
// описуємо змінну t // батьківського класу Triangle t; // створюємо об'єкт t дочірнього класу і // привласнюємо його змінної // батьківського класу t= new Equilateral(x); |
// метод буде перевизначатися в дочірньому класі, // тому в батьківському вказується virtual virtual public double Sqr() // у дочірньому класі переобумовлений метод // вказується зі специфікацією override override public double Sqr() |
// описуємо змінну 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 (обчислення площі) віртуальним.
Нехай у дочірньому класі буде ще свій метод, що обчислює радіус уписаної окружності.
Для того щоб викликати власний метод Radius з дочірнього класу, крім об'єкта t, довелося створити ще один об'єкт t1 дочірнього класу і застосувати до нього цей метод. Це довелося зробити тому, що змінна t у нас оголошена як Trapezoid, а в цьому класі немає методу Radius.
Відпрацьовування для рівнобічної трапеції
Відпрацьовування для звичайної трапеції