Коли використовувати абстрактні класи?


77

Ось стаття MSDN про абстрактні класи , але я насправді не розумію ...

Коли я дійсно повинен використовувати абстрактні класи? Які переваги використання абстрактних класів?


Стаття MSDN про абстрактні класи - це серйозно жарт, це сумно.
Юша

Відповіді:


141

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

Наприклад, припустимо, вам потрібно створити об’єкти Собака, Кішка, Хом'як та Риба. Вони мають подібні властивості, такі як колір, розмір та кількість ніг, а також поведінка, тому ви створюєте суперклас тварин. Однак якого кольору тварина? Скільки ніг у тваринного предмета? У цьому випадку немає сенсу створювати екземпляр об’єкта типу Animal, а лише лише його підкласи.

Абстрактні класи також мають додаткову перевагу в поліморфізмі - дозволяють використовувати тип (абстрактного) суперкласу як аргумент методу або тип повернення. Якщо, наприклад, у вас був клас PetOwner з методом train (), ви можете визначити його як прийняття об’єкта типу Animal, наприклад, train (Animal a), на відміну від створення методу для кожного підтипу Animal.


15
Тварина визначала б необхідність кольору, кількості ніг та властивостей розміру, тому, звертаючись до Кішки як до тварини, тоді я гаряче очікую, що тварина має колір, кількість ніг та розмір. Я також думаю, що ви могли б цілком законно реалізувати ці властивості в базовому класі, оскільки інакше це призвело б до дублювання коду. Описи тут трохи захоплюються властивостями, а не методами, не було б сенсу в Тварині застосовувати метод "Переміщення", оскільки кожна тварина може мати різний метод руху, але це визначало б необхідність "Переміщення" метод.
Лазар

Наступний відповідь допоміг мені зрозуміти , що абстрактний клас stackoverflow.com/a/2558588/2188550
Ivanzinho

Ми не повинні використовувати супер клас як тип повернення, оскільки він менш конкретний, і це погана практика. Тип повернення повинен бути більш конкретним. Якщо тип повернення Cat, тоді тварина не повинна використовуватися як тип повернення.
Ashish Kumar Jaryal

6

Використовуючи абстрактні класи, ми можемо зробити клас загальнішим.

Наприклад: якщо клас A є абстрактним класом і є класи класу B, клас C і клас D, що розширюють абстрактний клас A, то ці підкласи успадкують метод, який вже оголошений в абстрактному класі A, тим самим роблячи метод загальнішим.


4

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


4

Річард подав приклад , коли абстрактний клас має переваги перед не абстрактними класами.

Я хотів би додати таблицю фактів для вибору між абстрактним класом та інтерфейсом. Зображення можна знайти тут .

введіть тут опис зображення


3

Використовуйте абстрактні класи, коли ви визначаєте поведінку для класу в ієрархії вашого класу, який ніколи не буде використовуватися для безпосереднього створення об'єкта.

Отже, на мить подумайте про себе як про Бога. Ваші класи CBabyBoy та CBanyGirl не будуть абстрактними - оскільки це тверді об’єкти, які створюються. З іншого боку, ваші класи CPerson та CAnimal БИЛИ б абстрактними - вони корисні з точки зору ієрархії типів, але ви ніколи не будете працюватиCAnimal dingbat = new Animal();


2

В основному, ви повинні використовувати абстрактний клас, коли деяка сутність у вашій ієрархії логічно матиме методи, які він не знає, як реалізувати, але це роблять нащадки. Насправді в Інтернеті є мільярди прикладів „реального життя”)


3
Замість того, щоб "не знати", що насправді має бути "не може чи не повинен". Навіть у базовому прикладі об'єкта Shape метод draw може бути реалізований як порожній метод, але чи слід це робити?
Лазар

Цікава точка зору) Але я маю на увазі, що порожня реалізація, звичайно, не враховується =)
n535
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.