В C# існує можливість опису в базовому класі методів, а їх реалізацію залишити «на потім». Такі методи називають абстрактними.
Клас, у якому є хоча б один абстрактний метод, теж називається абстрактним і такий клас може служити тільки в якості базового класу. Створити об'єкти абстрактних класів неможливо, тому що там немає реалізації абстрактних методів.
Щоб клас – спадкоємець абстрактного класу не був у свою чергу абстрактним (хоча і це не заборонене), там повинні втримуватися перевизначення всіх успадкованих абстрактних методів.
Усі абстрактні методи обов'язково повинні бути заміщені в похідних класах
Очевидно, що абстрактні методи автоматично є віртуальними
Абстрактні методи пишуться з модифікатором abstract
public abstract double Square(); |
Клас, у якому є хоча б один абстрактний метод, називається абстрактним
Не можна створювати екземпляри абстрактного класу - такий клас може використовуватися тільки в якості базового класу для інших класів.
У такому класі можу бути і поля і звичайні методи, які можуть успадковуватися дочірніми класами.
Для потомка такого класу є дві можливості - або він реалізує всі абстрактні методи базового класу (і в цьому випадку для такого класу-потомка ми зможемо створювати його екземпляри), або він реалізує не всі абстрактні методи базового класу (у цьому випадку він є теж абстрактним класом і єдина можливість його використання - це робити від нього класи- потомки). При перевизначенні в похідному класі такий метод також оголошується з модифікатором override.
Наявність абстрактного методу дозволяє реалізувати примусовий поліморфізм. Справа в тому, що похідний клас зобов'язано реалізувати абстрактний метод (інакше цей клас залишається абстрактним і повинен бути описаний як abstract). Абстрактні методи за замовчуванням уважаються описаними як virtual (указувати virtual навіть не можна).
Абстрактні методи також, як і віртуальні, є частиною поліморфного інтерфейсу. Але якщо у випадку з віртуальними методами ми говоримо, що клас-спадкоємець успадковує реалізацію, то у випадку з абстрактними методами успадковується інтерфейс, представлений цими абстрактними методами.
Створимо абстрактний клас Figure, від якого робимо два класи - Circle (клас окружностей) і Triangle (клас трикутників).
Відпрацьовування
У реалізації цього прикладу в розділі 5.1 методи Area ( для підрахунку площі) і Border ( для підрахунку довжини окружності або периметра) у базовому класі було неможливо реалізувати, вони просто повертали нульові значення. Крім того створювати об'єкт класу Shape було позбавлено змісту. У реальності не існує такої геометричної фігури. Є коло, прямокутник, квадрат, але просто фігури немає. Однак же і коло, і квадрат, мають щось загальне і є фігурами.Такі ситуації зустрічаються, коли слід гарантувати неможливість створення об'єктів класу. У такому випадку базовий клас слід зробити абстрактним, указавши в його заголовку ключове слово abstract.
Реалізуємо цей же проект, використовуючи абстрактні класи.
Створимо абстрактний клас Shape, від якого робимо два класи - Circle (клас окружностей) і Square (клас квадратів).
Відпрацьовування