Віртуальний метод — метод класу, який може бути перевизначений у класах-спадкоємцях так, що конкретна реалізація методу для виклику буде визначатися під час виконання.
Таким чином, програмісту необов'язково знати точний тип об'єкта для роботи з ним. Досить лише знати, що об'єкт належить класу або спадкоємцеві класу, у якому метод оголошений.
Інтерфейси віртуального методу і усіх його версій повинні повністю збігатися. Таким чином, застосування віртуальних методів дозволяє фіксувати інтерфейс методу і потім розробити під цей інтерфейс нові реалізації.
В основі поліморфізму для сімейства класів, лежать три механізми:
// описуємо змінну 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.
Відпрацьовування для рівнобічної трапеції
Відпрацьовування для звичайної трапеції