Переклад:
Привіт, друзі! Якщо ви прочитали мою попередню статтю, то ми вже знайомились з основами ООП (об'єктно-орієнтованого програмування), а в цій статті ми розглянемо важливу концепцію ООП — Поліморфізм (Часове Багатоформність). Сподіваюсь, це буде корисно!
Що таке Поліморфізм?
Поліморфізм (Часове Багатоформність) — це одна з основних концепцій ООП (об'єктно-орієнтованого програмування), що дозволяє об'єкту поводитися по-різному в залежності від контексту. Це дозволяє методу з однаковим іменем працювати по-різному в залежності від ситуації.
Є два основних види:
1. Статичний поліморфізм
Статичний поліморфізм визначає, який метод буде викликаний під час компіляції (під час часу компіляції). Метод можна викликати кілька разів з однаковим ім'ям, і він працюватиме в залежності від формату параметрів. Наприклад;
Ми створили клас Area і використовували метод calculateArea двічі для двох різних ситуацій. Під час створення об'єкта буде вибрано той варіант, який підходить.
У першому випадку працює "Обчислення площі квадрата", у другому — "Обчислення площі прямокутника". Отже, ми використали одну функцію двічі.
2. Динамічний поліморфізм
Динамічний поліморфізм визначає, який метод буде викликаний під час виконання програми (під час часу виконання). Зазвичай використовується "Override" (перезапис методу), що дозволяє методам базового класу бути переписаними в похідних класах відповідно до їхнього бажання.
Це здійснюється за допомогою ключових слів "Virtual та Override".
Ми створили клас Animal і визначили його атрибути (властивості). Потім ми створили клас Cat, який наслідує від Animal.
Оскільки кожна тварина має свій звук, ми створили метод voice в базовому класі і позначили його як virtual, щоб інші класи, які наслідують від Animal, могли використовувати цей метод. Клас Cat має використовувати метод через ключове слово override, якщо він хоче перевизначити його. Потім він може використовувати свій власний звук в цьому методі, як показано в прикладі.
Створення об'єкта та виведення результату на екран.
Використання посилань і поліморфізм
Використання посилань дозволяє приховати реальний тип об'єкта і працювати з об'єктами похідних класів через посилання на базовий клас. Це дозволяє створювати гнучку структуру, де об'єкти з різних класів можуть управлятися через одне посилання.
Давайте розглянемо код для більш детального розуміння:
Нехай у нас є класи A та B, де клас B наслідує клас A і виводить деякі результати на екран. Тепер давайте створимо об'єкти з цих класів:
Зазвичай ми створюємо об'єкти так, як показано в першому прикладі, де A a = new A() створює об'єкт класу A.
переклад:
А що як би ми створили A b = new B()? Давайте розглянемо це.
Доступ до властивостей класу A через об'єкт a
Якщо розглядати випадок A a = new A(), то ми створюємо об'єкт класу A через посилання на цей клас, це і є український переклад того, що ми робимо.
Якщо розглянути B b = new B(), то тут ми створюємо об'єкт класу B через посилання на цей клас.
Доступ до властивостей класів A та B через об'єкт b
Оскільки клас B наслідується від A, об'єкт b має доступ до властивостей класу B і, крім того, до властивостей класу A. Проте об'єкт a, створений через A a = new A(), не має доступу до властивостей класу B. Давайте це зрозуміємо.
А тепер розглянемо найцікавіше — A b = new B(). Така операція можлива. Це означає, що через посилання на клас A ми створюємо об'єкт класу B.
Подивімося на об'єкт A c = new B();
Як це стало можливим? Суть в тому, що ми створили об'єкт класу B через посилання на клас A, яке ми назвали c. Зазвичай, об'єкт, створений через посилання класу A, міг би лише виводити властивості класу A, але є виняток. Якщо метод класу B перезаписує метод класу A за допомогою override, то при виклику цього методу буде виконано перевизначену версію з класу B.
Для методу Display ми очікуємо, що спрацює метод класу A, але оскільки метод був перезаписаний в класі B, викликається метод з B.
Для методу Info жодна зміна не застосована через override, тому працює метод з базового класу A.
Метод specialForA працює тому, що об'єкт був створений через посилання класу A, і тому не має доступу до specialForB. Тому викликається specialForA.
А що якщо ми створимо B z = new A()?
Відповідь: Ні!!
Посилання має бути на базовий клас.
У цій статті ми розглянули важливі аспекти поліморфізму і спробували їх пояснити. Сподіваюсь, це було корисно. В наступній статті я розгляну концепції абстракції та інтерфейсів. Дякую всім, хто читає! До зустрічі!
https://www.linkedin.com/in/erenctns/
Перекладено з: Polymorphism With C#