Спадкування (програмування)

Матеріал з Seo Wiki - Пошукова Оптимізація і Програмування

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

Іншими словами, клас-спадкоємець реалізує специфікацію вже існуючого класу (базовий клас). Це дозволяє звертатися з об'єктами класу-спадкоємця точно так же, як з об'єктами базового класу [1].

типи успадкування

просте спадкування

Клас. від якого відбулося спадкування, називається базовим або батьківським (англ. base class). Класи, які походять від базового, називаються нащадками. спадкоємцями або похідними класами (англ. derived class).

Деякі мови використовують абстрактні класи. Абстрактний клас - це клас, що містить хоча б один абстрактний метод. він описаний в програмі, має поля. методи і не може використовуватися для безпосереднього створення об'єкта. Тобто від абстрактного класу можна тільки наслідувати. Об'єкти створюються тільки на основі похідних класів, успадкованих від абстрактного. Наприклад, абстрактним класом може бути базовий клас «співробітник вузу», від якого успадковуються класи «аспірант», «професор» і т. Д. Так як похідні класи мають спільні поля і функції (наприклад, поле «рік народження»), то ці члени класу можуть бути описані в базовому класі. У програмі створюються об'єкти на основі класів «аспірант», «професор», але немає сенсу створювати об'єкт на основі класу «співробітник вузу».

множинне спадкування

При множині спадкування у класу може бути більш одного предка. В цьому випадку клас успадковує методи всіх предків. Переваги такого підходу в більшій гнучкості. Множинне спадкування реалізовано в C ++. З інших мов, які надають цю можливість, можна відзначити Python і Ейфель. Множинне успадкування підтримується в мові UML.

Множинне спадкування - потенційне джерело помилок, які можуть виникнути через наявність однакових імен методів в предках. У мовах, які позиціонуються як спадкоємці C ++ (Java. C # і ін.), Від множинного успадкування було вирішено відмовитися на користь інтерфейсів. Практично завжди можна обійтися без використання даного механізму. Однак, якщо така необхідність все-таки виникла, то, для вирішення конфліктів використання успадкованих методів з однаковими іменами, можливо, наприклад, застосувати операцію розширення видимості - «::» - для виклику конкретного методу конкретного батька.

Спроба вирішення проблеми наявності однакових імен методів в предках була зроблена в мові Ейфель. в якому при описі нового класу необхідно явно вказувати імпортовані члени кожного з успадкованих класів і їх іменування в дочірньому класі.

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

Єдиний базовий клас

У ряді мов програмування все класи явно або неявно успадковуються від якогось базового класу. Smalltalk був одним з перших мов, в яких використовувалася ця концепція. До таких мов відносяться Java (Object), C # (System.Object), Delphi (TObject).

Спадкування в мові C ++

У C ++ існує три типи успадкування: public. protected. private. Специфікатори доступу членів базового класу змінюються в нащадках наступним чином:

  • при public-спадкуванні все специфікатор залишаються без зміни.
  • при protected-спадкуванні все специфікатор залишаються без зміни, крім специфікатор public, який змінюється на специфікатор protected (тобто public-члени базового класу в нащадках стають protected).
  • при private-спадкуванні все специфікатор змінюються на private.

Одним з основних переваг public-успадкування є те, що покажчик на класи-спадкоємці може бути неявно перетворений в покажчик на базовий клас, тобто для прикладу вище можна написати:

Ця цікава особливість відкриває можливість динамічної ідентифікації типу (RTTI).

Спадкування в мові Delphi (Object Pascal)

Схожі статті