Спадкування (керівництво з програмування на c #)

Спадкування, разом з инкапсуляцией і поліморфізмом, є однією з трьох основних характеристик (або базових понять) об'єктно-орієнтованого програмування. Спадкування дозволяє створювати нові класи, які повторно використовують, розширюють і змінюють поведінку, певне в інших класах. Клас, члени якого успадковуються, називається базовим класом. а клас, який успадковує ці члени, називається похідним класом. Похідний клас може мати тільки один безпосередній базовий клас. Однак успадкування є транзитивним. Якщо ClassC є похідним від ClassB, і ClassB є похідним від ClassA, ClassC успадковує члени, оголошені в ClassB і ClassA.

Структури не підтримують успадкування, але вони можуть реалізовувати інтерфейси. Додаткові відомості див. У розділі Інтерфейси (Керівництво з програмування в C #).

Концептуально, похідний клас є спеціалізацією базового класу. Наприклад, при наявності базового класу Animal. можлива наявність одного похідного класу, який називається Mammal. і ще одного похідного класу, який називається Reptile. Mammal є Animal і Reptile є Animal. але кожен похідний клас представляє різні спеціалізації базового класу.

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

Нижче ілюструється клас WorkItem. представляє робочий елемент в бізнес-процесі. Подібно до всіх класів, він є похідним від Object і успадковує всі його методи. У WorkItem є п'ять своїх членів. Сюди входить конструктор, оскільки конструктори не успадковуються. Клас ChangeRequest успадковується від WorkItem і представляє конкретний вид робочого елемента. ChangeRequest додає ще два члена до членів, успадкованим від WorkItem і Object. Він повинен додати власний конструктор, і він також додає originalItemID. Властивість originalItemID дозволяє зв'язати екземпляр ChangeRequest з вихідним об'єктом WorkItem. до якого застосовано запит на зміну.

Спадкування (керівництво з програмування на c #)

У наступному малюнку показано, як виражаються в C # відносини між класами, продемонстровані в попередньому прикладі. У наступному прикладі також показано, як WorkItem переопределяет віртуальний метод Object.ToString. і як клас ChangeRequest успадковує реалізацію WorkItem методу.

Коли базовий клас оголошує метод як віртуальний. похідний клас може перевизначити метод за допомогою своєї власної реалізації. Якщо базовий клас оголошує член як абстрактний. то цей метод повинен бути перевизначений в будь-якому неабстрактне класі, який прямо успадковує від цього класу. Якщо похідний клас сам є абстрактним, то він успадковує абстрактні члени, які не реалізуючи їх. Абстрактні та віртуальні члени є основою для поліморфізму, який є другою основною характеристикою об'єктно-орієнтованого програмування. Додаткові відомості див. У розділі Поліморфізм (Керівництво з програмування на C #).

Можна оголосити клас як абстрактний. якщо необхідно запобігти прямому створення примірників за допомогою ключового слова new. При такому підході клас можна використовувати, тільки якщо новий клас є похідним від нього. Абстрактний клас може містити один або кілька сигнатур методів, які самі оголошені в якості абстрактних. Ці сигнатури задають параметри і повертають значення, але не мають реалізації (тіла методу). Абстрактного класу необов'язково містити абстрактні члени; проте, якщо клас все ж містить абстрактний член, то сам клас повинен бути оголошений як абстрактного. Похідні класи, які самі не є абстрактними, повинні надати реалізацію для будь-яких абстрактних методів з абстрактного базового класу. Додаткові відомості див. У розділі Абстрактні і запечатані класи і члени класів (Керівництво з програмування на C #).

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

Інтерфейси використовуються для визначення певних можливостей для класів, які не обов'язково мають відношення тотожності. Наприклад, інтерфейс IEquatable може бути реалізований будь-яким класом або структурою, що включає клієнтський код для визначення еквівалентності двох об'єктів типу (проте тип визначає еквівалентність). IEquatable не має на увазі той же вид відносин тотожності, який існує між базовим і похідним класами (наприклад, Mammal є Animal). Додаткові відомості див. У розділі Інтерфейси (Керівництво з програмування в C #).

З похідного класу можна отримати доступ до відкритих, захищеним, внутрішнім і захищеним внутрішнім членам базового класу. Хоча похідний клас і успадковує закриті члени базового класу, він не може отримати доступ до цих членам. Однак всі ці закриті члени все ж присутні в похідному класі і можуть виконувати ту ж роботу, що і в самому базовому класі. Наприклад, припустимо, що захищений метод базового класу має доступ до закритого полю. Це поле повинне бути присутнім в похідному класі для правильної роботи успадкованого методу базового класу.

Схожі статті