Спадкування (керівництво з програмування на c #), microsoft docs
В цій статті
Спадкування, разом з инкапсуляцией і поліморфізмом, є однією з трьох основних характеристик об'єктно-орієнтованого програмування. Спадкування дозволяє створювати нові класи, які повторно використовують, розширюють і змінюють поведінку, певне в іншому класі. Клас, члени якого успадковуються, називається базовим класом. а клас, який успадковує ці члени, називається похідним класом. Похідний клас може мати тільки один прямий базовий клас. Однак успадкування є транзитивним. Якщо клас ClassC є похідним від ClassB, і ClassB є похідним від ClassA, ClassC успадковує члени, оголошені в ClassB і ClassA.
Примітка
Структури не підтримують успадкування, але можуть реалізовувати інтерфейси. Додаткові відомості див. У розділі Інтерфейси.
Концептуально похідний клас є спеціалізацією базового класу. Наприклад, при наявності базового класу Animal можлива наявність одного похідного класу, який називається Mammal. і ще одного похідного класу, який називається Reptile. Mammal є Animal і Reptile є Animal. але кожен похідний клас представляє різні спеціалізації базового класу.
При визначенні класу для наслідування від іншого класу похідний клас явно отримує всі члени базового класу за винятком конструкторів і методів завершення. Похідний клас може, таким чином, повторно використовувати код в базовому класі без необхідності в його повторної реалізації. У похідному класі можна додати більше членів. Таким чином, похідний клас розширює функціональність базового класу.
На наступному малюнку показаний клас WorkItem. представляє робочий елемент в бізнес-процесі. Як і інші класи, він є похідним від System.Object і успадковує всі його методи. У WorkItem є п'ять своїх членів. До них відносяться конструктор, оскільки конструктори не успадковуються. Клас ChangeRequest успадковує від WorkItem і представляє конкретний вид робочого елемента. ChangeRequest додає ще два члена до членів, успадкованим від WorkItem і Object. Він повинен додати власний конструктор, і він також додає originalItemID. Властивість originalItemID дозволяє ChangeRequest зв'язати екземпляр з вихідним об'єктом WorkItem. до якого застосовано запит на зміну.
У наступному прикладі показано, як виражаються в C # відносини між класами, продемонстровані на попередньому малюнку. У прикладі також показано, як WorkItem переопределяет віртуальний метод Object.ToString і як клас ChangeRequest успадковує WorkItem реалізацію методу.
Абстрактні та віртуальні методи
Коли базовий клас оголошує метод як віртуальний. похідний клас може перевизначити метод за допомогою своєї власної реалізації. Якщо базовий клас оголошує член як абстрактний. цей метод повинен бути перевизначений в будь-якому неабстрактне класі, який прямо успадковує від цього класу. Якщо похідний клас сам є абстрактним, то він успадковує абстрактні члени, які не реалізуючи їх. Абстрактні та віртуальні члени є основою для поліморфізму, який є другою основною характеристикою об'єктно-орієнтованого програмування. Додаткові відомості див. У розділі Поліморфізм.
Абстрактні базові класи
Можна оголосити клас як абстрактний. якщо необхідно запобігти прямому створення примірників за допомогою ключового слова new. При такому підході клас можна використовувати, тільки якщо новий клас є похідним від нього. Абстрактний клас може містити один або кілька сигнатур методів, які самі оголошені в якості абстрактних. Ці сигнатури задають параметри і повертають значення, але не мають реалізації (тіла методу). Абстрактного класу необов'язково містити абстрактні члени; однак якщо клас все ж містить абстрактний член, то сам клас повинен бути оголошений як абстрактного. Похідні класи, які самі не є абстрактними, повинні надати реалізацію для будь-яких абстрактних методів з абстрактного базового класу. Додаткові відомості див. У розділі Абстрактні і запечатані класи і члени класів.
інтерфейси
Інтерфейс є посилальним типом, в чем-то схожим з абстрактним базовим класом, який складається тільки з абстрактних членів. Якщо клас реалізує інтерфейс, цей клас повинен надавати реалізацію для всіх членів інтерфейсу. У класі може бути реалізовано кілька інтерфейсів, хоча похідним він може бути тільки від одного прямого базового класу.
Інтерфейси використовуються для визначення певних можливостей для класів, які не обов'язково мають відношення тотожності. Наприклад, інтерфейс System.IEquatable
Запобігання подальшого успадкування
Клас може запобігти успадкування від інших класів або успадкування від будь-яких його членів, оголосивши себе або члени запечатаними. Додаткові відомості див. У розділі Абстрактні і запечатані класи і члени класів.