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

Абстрактні методи

В C# існує можливість опису в базовому класі методів, а їх реалізацію залишити «на потім». Такі методи називають абстрактними.

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

Щоб клас – спадкоємець абстрактного класу не був у свою чергу абстрактним (хоча і це не заборонене), там повинні втримуватися перевизначення всіх успадкованих абстрактних методів.

Усі абстрактні методи обов'язково повинні бути заміщені в похідних класах

Очевидно, що абстрактні методи автоматично є віртуальними

Абстрактні методи пишуться з модифікатором abstract
public abstract double Square();

Абстрактні класи

Клас, у якому є хоча б один абстрактний метод, називається абстрактним

Не можна створювати екземпляри абстрактного класу - такий клас може використовуватися тільки в якості базового класу для інших класів.

У такому класі можу бути і поля і звичайні методи, які можуть успадковуватися дочірніми класами.

Для потомка такого класу є дві можливості - або він реалізує всі абстрактні методи базового класу (і в цьому випадку для такого класу-потомка ми зможемо створювати його екземпляри), або він реалізує не всі абстрактні методи базового класу (у цьому випадку він є теж абстрактним класом і єдина можливість його використання - це робити від нього класи- потомки). При перевизначенні в похідному класі такий метод також оголошується з модифікатором override.

Наявність абстрактного методу дозволяє реалізувати примусовий поліморфізм. Справа в тому, що похідний клас зобов'язано реалізувати абстрактний метод (інакше цей клас залишається абстрактним і повинен бути описаний як abstract). Абстрактні методи за замовчуванням уважаються описаними як virtual (указувати virtual навіть не можна).

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

Приклад

Створимо абстрактний клас Figure, від якого робимо два класи - Circle (клас окружностей) і Triangle (клас трикутників).

У класі Figure створимо три абстрактні методи

У дочірньому класі Triangle:

У дочірньому класі Circle:

У класі Program у циклі з п'яти витків

Відпрацьовування

Приклад з розділу 5.1

У реалізації цього прикладу в розділі 5.1 методи Area ( для підрахунку площі) і Border ( для підрахунку довжини окружності або периметра) у базовому класі було неможливо реалізувати, вони просто повертали нульові значення. Крім того створювати об'єкт класу Shape було позбавлено змісту. У реальності не існує такої геометричної фігури. Є коло, прямокутник, квадрат, але просто фігури немає. Однак же і коло, і квадрат, мають щось загальне і є фігурами.Такі ситуації зустрічаються, коли слід гарантувати неможливість створення об'єктів класу. У такому випадку базовий клас слід зробити абстрактним, указавши в його заголовку ключове слово abstract.

Реалізуємо цей же проект, використовуючи абстрактні класи.

Створимо абстрактний клас Shape, від якого робимо два класи - Circle (клас окружностей) і Square (клас квадратів).

У класі Shape створимо два абстрактні методи

У класі Shape створимо звичайний метод

У дочірньому класі Square:

У дочірньому класі Circle:

У класі Program

Відпрацьовування

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