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

Автор: www.NiNa.Az
02 Лют, 2025 / 04:42

Успадкування англ inheritance наслідування це помилкова назва калькована з рос наследование один з принципів об єктно ор

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

Успадкування (англ. inheritance, „наслідування“ це помилкова назва, калькована з рос. наследование) — один з принципів об'єктно-орієнтовного програмування, який дає класу можливість використовувати програмний код іншого (базового) класу, доповнюючи його своїми власними деталями реалізації. Іншими словами, під час успадкування відбувається отримання нового (похідного) класу, який містить програмний код базового класу з зазначенням власних особливостей використання. Успадкування належить до типу is-a відношень між класами. При успадкуванні створюється спеціалізована версія вже наявного класу.

image
Позначення наслідування на UML-діаграмі класів.

В Unified Modeling Language успадкування класів відображується на діаграми класів.

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

Правильне використання механізму успадкування дає наступні взаємозв'язані переваги:

  • ефективна побудова складних ієрархій класів з можливістю їх модифікації. Роботу класів в ієрархії можна змінювати шляхом додавання нових успадкованих класів в потрібному місці ієрархії;
  • повторне використання раніше написаного коду з подальшою його модифікацією під поставлену задачу. Своєю чергою, новостворений код також може використовуватися на ієрархіях нижчих класів;
  • зручність в супроводі (доповнені) програмного коду шляхом введення нових класів з новими можливостями;
  • зменшення кількості логічних помилок при розробці складних програмних систем. Повторно використовуваний код частіше тестується, а, отже, менша ймовірність наявності в ньому помилок;
  • легкість в узгодженні різних частин програмного коду шляхом використання інтерфейсів. Якщо два класи успадковані від загального нащадка, поведінка цих класів буде однакова у всіх випадках. Це твердження виходить з вимоги, що схожі об'єкти повинні мати схожу поведінку. Саме використання інтерфейсів зумовлює схожість поведінки об'єктів;
  • створення бібліотек коду, які можна використовувати й доповнювати власними розробками;
  • можливість реалізовувати відомі шаблони проєктування для побудови гнучкого коду, який не змінює попередніх розробок;
  • використання переваг поліморфізму неможливо без успадкування. Завдяки поліморфізму забезпечується принцип: один інтерфейс — декілька реалізацій;
  • забезпечення дослідницького програмування (швидкого макетування). Таке програмування використовується у випадках, коли цілі та потреби до програмної системи на початку нечіткі. Спочатку створюється макет структури, потім цей макет поетапно вдосконалюється шляхом успадкування попереднього. Процес триває до отримання потрібного результату;
  • ліпше розуміння структури програмної системи програмістом завдяки природному представленню механізму успадкування. Якщо при побудові складних ієрархій намагатись використовувати інші принципи, то це може значно ускладнити розуміння усієї задачі та призведе до збільшення кількості помилок.

Недоліки використання наслідування

При використанні наслідування в програмах були помічені наступні недоліки:

  • неможливо змінити успадковану реалізацію під час виконання;
  • низька швидкість виконання. Швидкість виконання програмного коду загального призначення нижча, ніж у випадку використання спеціалізованого коду, який написаний конкретно для цієї задачі. Однак, цей недолік можна виправити завдяки оптимізації коду;
  • великий розмір програм через використання бібліотек загального призначення. Якщо для деякої задачі розробляти вузькоспеціалізований програмний код, то цей код буде займати менше пам'яти ніж код загального призначення;
  • збільшення складності програми у випадку неправильного або невмілого використання успадкування. Програміст зобов'язаний вміти коректно використовувати успадкування при побудові ієрархій класів. В іншому випадку це призведе до великого ускладненню програмного коду, і, як результат, збільшенню кількості помилок;
  • складність засвоєння початковими програмістами основ побудови програм, які використовують успадкування. Однак, цей недолік умовний, бо залежить від досвіду програміста.

Термінологія

В об'єктно-орієнтованому програмуванні, починаючи з Simula 67, абстрактні типи данних називаются класами.

(англ. base class) — це клас, який перебуває на вершині ієрархії успадкування класів і в основі дерева підкласів, тобто не є підкласом і не має успадкувань від інших суперкласів або інтерфейсів. Базовим класом може бути абстрактний клас і інтерфейс. Будь-який не базовий клас є підкласом.

(англ. superclass), батьківський клас (англ. parent class), предок або надклас — клас, від якого виконується успадкування в підкласах, тобто клас, від якого спадкують інші класи. Суперкласом може бути підклас, базовий клас, абстрактний клас і інтерфейс.

Підклас (англ. subclass), похідний клас (англ. derived class), дочірній клас (англ. child class), клас-нащадок або клас-реалізатор — клас, який спадкує від суперкласу або інтерфейсу, тобто клас визначений через успадкування від іншого класу або деяких таких класів. Підкласом може бути суперклас.

Інтерфейс (англ. interface) — це структура, що визначає чистий інтерфейс класу, що складається з абстрактних методів. Інтерфейси беруть участь в ієрархії успадкування класів і інтерфейсів.

Базовий інтерфейс (англ. base interface) — це аналог базового класу в ієрархії успадкування інтерфейсів, тобто це інтерфейс, який перебуває на вершині ієрархії успадкування.

Суперінтерфейс (англ. super interface) або інтерфейс-предок — це аналог суперкласу в ієрархії успадкування, тобто від цього інтерфейсу виконується успадкування в підкласах і підінтерфейсах.

Інтерфейс-нащадок або похідний інтерфейс (англ. derived interface) — це аналог підкласу в ієрархії успадкування інтерфейсів, тобто це інтерфейс, який спадкує від одного або декількох суперінтерфейсів.

Ієрархія успадкування або ієрархія класів — дерево, елементами якого є класи та інтерфейси.

Застосування

Успадкування є механізмом повторного використання коду (англ. code reuse) і сприяє незалежному розширенню програмного забезпечення через відкриті класи (англ. public classes) та інтерфейси (англ. interfaces). Встановлення відношення успадкування між класами породжує [en].

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

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

«Просте» успадкування, або одинарне успадкування, описує спорідненість між двома класами: один з яких спадкує від іншого. З одного класу може виводитися багато класів, але навіть в цьому випадку подібний вид взаємозвязку залишається «простим» успадкуванням.

Абстрактні класи і створення об'єктів

Для деяких мов програмування справедлива наступна концепція.

Існують «абстрактні» класи (оголошуються такими довільно або через приписані до них абстрактні методи); їх можна описувати наявними поля та методи. Створення ж об'єктів (екземплярів) означає конкретизацію, застосовну тільки до неабстрактних класів (в тому числі, до неабстрактних нащадків абстрактних), — представниками яких, в результаті, будуть створені об'єкти.

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

Докладніше: Множинне успадкування

При множинному успадкуванні класа може мати більш, ніж одного предка. В цьому випадку клас успадковує методи всіх предків. Переваги такого підходу в більшій гнучкості.

Множинне успадкування реалізовано в C++. З інших мов, що надають цю можливість, можна відмітити Python і Eiffel. Множинне успадкування підтримується в мові UML.

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

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

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

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

В ряді мов програмування, усі класи, — явно або неявно, — успадковуються від деякого базового класу. Smalltalk був одним з перших мов, в яких використовувалась ця концепція. До таких мов також відносяться: Objective-C (NSObject), Perl (UNIVERSAL), Eiffel (ANY), Java (java.lang.Object), C# (System.Object), Delphi (TObject), Scala (Any).

Успадкування в мовах програмування

C++

Успадкування в C++:

class A {}; // Базовий клас  class B : public A {}; // Public-успадкування class C : protected A {}; // Protected-успадкування class Z : private A {}; // Private-успадкування 

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

  • public:
    1. public-члени базового класу — доступні як public-члени похідного класу;
    2. protected-члени базового класу — доступні як protected-члени похідного класу;
  • protected:
    1. public- і protected-члени базового класу — доступні як protected-члени похідного класу;
  • private:
    1. public- і protected-члени базового класу — доступні як private-члени похідного класу.

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

A* a = new B(); 

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

Delphi (Object Pascal)

Для використання механізму наслідування в Delphi необхідно в оголошені класу в дужках class вказати клас предок: Предок:

TAncestor = class private protected public //Віртуальна процедура  procedure VirtualProcedure; virtual; abstract;   procedure StaticProcedure; end; 

Наслідник:

TDescendant = class(TAncestor) private protected public  //Перекриття віртуальної процедуры  procedure VirtualProcedure; override;  procedure StaticProcedure; end; 

Абсолютно всі класи в Delphi є нащадками класа TObject. Якщо клас-предок не вказан, то мається на увазі, що новий клас є прямим нащадком класа TObject.

Множинне наслідування в Delphi з самого початку не підтримується, однак для тих, кому без цього не обійтись, усе ж є такі можливості, наприклад, за рахунок використання класів-помічників(англ. Class Helpers).

Python

Python підтримує як одиночне, так і множинне успадкування. При доступі до атрибуту, перегляд похідних класів прохидить в порядку розширення метода (англ. method resolution order, MRO).

class Ancestor1(object): # Предок-1  def m1(self): pass class Ancestor2(object): # Предок-2  def m1(self): pass class Descendant(Ancestor1, Ancestor2): # Наслідник  def m2(self): pass  d = Descendant() # Ініціалізація print d.__class__.__mro__ # Порядок розширення метода: 
(<class '__main__.Descendant'>, <class '__main__.Ancestor1'>, <class '__main__.Ancestor2'>, <type 'object'>) 

З версії Python 2.2 в мові існують «класичні» класи і «нові» класи. Останні є нащадками object. «Класичні» класи будуть підтримувати включно до версії 2.6, але видалені з мови в Python 3.0.

Множинне успадкування застосовують у Python для введення в основний клас класів-домішок (англ. mix-in).

PHP

Для використання механізма наслідування в PHP необхідно в оголошенні класу після імені оголошеного класу-наслідника вказати слово extends і ім'я класу-предка:

class Descendant extends Ancestor { } 

У випадку перекриття класом-нащадком методів предка доступ до методів предка можна отримати з використанням ключового слова parent:

class A {  function example() {  echo "Викликаний метод A::example().\n";  } }  class B extends A {  function example() {  echo "Викликаний метод B::example().\n";  parent::example();  } } 

Можна запобігти перекриття класом-нащадком методів предка; для цього необхідно вказати ключове слово final:

class A {  final function example() {  echo "Викликаний метод A::example().\n";  } }  class B extends A {  function example() { //викличе помилку  parent::example(); //і ніколи не виконається  } } 

Щоб при успадкуванні звернутись до конструктора батьківського класу, необхідно дочірньому класу в конструкторі вказати parent::__construct();

Objective-C

@interface A : NSObject  - (void) example; @end  @implementation - (void) example {  NSLog(@"Class A"); } @end  @interface B : A - (void) example; @end  @implementation - (void) example {  NSLog(@"Class B"); } @end 

В інтерфейсі оголошують методи, які буде видно ззовні класу (public).

Внутрішні методи можна реалізовувати без інтерфейсу. Для оголошення додаткових властивостей користуються interface-extension у файлі реалізації.

Усі методи в Objective-C — віртуальні.

Java

Приклад успадкування від одного класу і двох інтерфейсів:

public class A { }  public interface I1 { }  public interface I2 { }  public class B extends A implements I1, I2 { } 

Директива final в оголошені класа робить успадкування від нього неможливим.

C#

Приклад успадкування від одного класу і двох інтерфейсів:

public class A { }  public interface I1 { }  public interface I2 { }  public class B : A, I1, I2 { } 

Успадкування від типізованих класів можна здійснювати, вказавши фіксований тип або шляхом переносу змінної типу в успадкований клас:

public class A<T>  { }  public class B : A<int>  { }  public class B2<T> : A<T>  { } 

Допускається також успадкування вкладених класів від класів, які їх містять:

class A // default class A is internal, not public class B can not be public (клас A за замовчуванням є внутрішнім, не публічний клас B не може бути публічним)   {  class B : A { }  } 

Директива sealed в оголошені класа робить успадкування від нього неможливим.

Ruby

class Parent   def public_method  "Public method"  end   private   def private_method  "Private method"  end  end  class Child < Parent   def public_method  "Redefined public method"  end   def call_private_method  "Ancestor's private method: " + private_method  end  end 

Клас Parent є предком для класу Child, в якого перевизначений метод public_method.

child = Child.new child.public_method #=> "Redefined public method" child.call_private_method #=> "Ancestor's private method: Private method" 

Приватні методи предка можна викликати з нащадків.

JavaScript

class Parent {  constructor(data) {  this.data = data;  }    publicMethod() {  return 'Public Method';  } }  class Child extends Parent {  getData() {  return `Data: ${this.data}`;  }   publicMethod() {  return 'Redefined public method';  } }  const test = new Child('test');  test.getData(); // => 'Data: test' test.publicMethod(); // => 'Redefined public method' test.data; // => 'test' 

Клас Parent є предком для класу Child, в якого перевизначений метод publicMethod.

В JavaScript використовується прототипне успадкування.

Конструктори і деструктори

В С++ конструктори при успадкуванні викликаються почергово від першого предка до останнього нащадка, а деструктори навпаки — від останнього нащадка до першого предка.

class First { public:  First() { cout << ">>First constructor" << endl; }  ~First() { cout << ">>First destructor" << endl; } };  class Second: public First { public:  Second() { cout << ">Second constructor" << endl; }  ~Second() { cout << ">Second destructor" << endl; } };  class Third: public Second { public:  Third() { cout << "Third constructor" << endl; }  ~Third() { cout << "Third destructor" << endl; } };  // виконання коду Third *th = new Third(); delete th;  // результат виведення /* >>First constructor >Second constructor Third constructor  Third destructor >Second destructor >>First destructor */ 

Див. також

  • Поліморфізм (програмування)
  • Інкапсуляція (програмування)
  • Клас (програмування)
  • Методи (програмування)
  • Поля (програмування)
  • Інтерфейс (програмування)
  • Ієрархія
  • UML
  • Принцип підстановки Лісков
  • Мови програмування

Примітки

  1. Что такое объектно-ориентированное программирование? (рос.).
  2. Home | Computer Science and Engineering. www.cse.msu.edu. Процитовано 20 жовтня 2021.
  3. Ekendahl, Robert (2006). Hardware verification with C++ : a practitioner's handbook. New York: Springer. ISBN 978-0-387-36254-0. OCLC 262687433.
  4. C++ Inheritance. Архів оригіналу за 24 вересня 2023. Процитовано 20 жовтня 2021.
  5. Python 2.2 (англ.).
  6. C# и .NET | Наследование (рос.).

Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет

Uspadkuvannya angl inheritance nasliduvannya ce pomilkova nazva kalkovana z ros nasledovanie odin z principiv ob yektno oriyentovnogo programuvannya yakij daye klasu mozhlivist vikoristovuvati programnij kod inshogo bazovogo klasu dopovnyuyuchi jogo svoyimi vlasnimi detalyami realizaciyi Inshimi slovami pid chas uspadkuvannya vidbuvayetsya otrimannya novogo pohidnogo klasu yakij mistit programnij kod bazovogo klasu z zaznachennyam vlasnih osoblivostej vikoristannya Uspadkuvannya nalezhit do tipu is a vidnoshen mizh klasami Pri uspadkuvanni stvoryuyetsya specializovana versiya vzhe nayavnogo klasu Poznachennya nasliduvannya na UML diagrami klasiv V Unified Modeling Language uspadkuvannya klasiv vidobrazhuyetsya na diagrami klasiv Perevagi vikoristannya uspadkuvannyaPravilne vikoristannya mehanizmu uspadkuvannya daye nastupni vzayemozv yazani perevagi efektivna pobudova skladnih iyerarhij klasiv z mozhlivistyu yih modifikaciyi Robotu klasiv v iyerarhiyi mozhna zminyuvati shlyahom dodavannya novih uspadkovanih klasiv v potribnomu misci iyerarhiyi povtorne vikoristannya ranishe napisanogo kodu z podalshoyu jogo modifikaciyeyu pid postavlenu zadachu Svoyeyu chergoyu novostvorenij kod takozh mozhe vikoristovuvatisya na iyerarhiyah nizhchih klasiv zruchnist v suprovodi dopovneni programnogo kodu shlyahom vvedennya novih klasiv z novimi mozhlivostyami zmenshennya kilkosti logichnih pomilok pri rozrobci skladnih programnih sistem Povtorno vikoristovuvanij kod chastishe testuyetsya a otzhe mensha jmovirnist nayavnosti v nomu pomilok legkist v uzgodzhenni riznih chastin programnogo kodu shlyahom vikoristannya interfejsiv Yaksho dva klasi uspadkovani vid zagalnogo nashadka povedinka cih klasiv bude odnakova u vsih vipadkah Ce tverdzhennya vihodit z vimogi sho shozhi ob yekti povinni mati shozhu povedinku Same vikoristannya interfejsiv zumovlyuye shozhist povedinki ob yektiv stvorennya bibliotek kodu yaki mozhna vikoristovuvati j dopovnyuvati vlasnimi rozrobkami mozhlivist realizovuvati vidomi shabloni proyektuvannya dlya pobudovi gnuchkogo kodu yakij ne zminyuye poperednih rozrobok vikoristannya perevag polimorfizmu nemozhlivo bez uspadkuvannya Zavdyaki polimorfizmu zabezpechuyetsya princip odin interfejs dekilka realizacij zabezpechennya doslidnickogo programuvannya shvidkogo maketuvannya Take programuvannya vikoristovuyetsya u vipadkah koli cili ta potrebi do programnoyi sistemi na pochatku nechitki Spochatku stvoryuyetsya maket strukturi potim cej maket poetapno vdoskonalyuyetsya shlyahom uspadkuvannya poperednogo Proces trivaye do otrimannya potribnogo rezultatu lipshe rozuminnya strukturi programnoyi sistemi programistom zavdyaki prirodnomu predstavlennyu mehanizmu uspadkuvannya Yaksho pri pobudovi skladnih iyerarhij namagatis vikoristovuvati inshi principi to ce mozhe znachno uskladniti rozuminnya usiyeyi zadachi ta prizvede do zbilshennya kilkosti pomilok Nedoliki vikoristannya nasliduvannyaPri vikoristanni nasliduvannya v programah buli pomicheni nastupni nedoliki nemozhlivo zminiti uspadkovanu realizaciyu pid chas vikonannya nizka shvidkist vikonannya Shvidkist vikonannya programnogo kodu zagalnogo priznachennya nizhcha nizh u vipadku vikoristannya specializovanogo kodu yakij napisanij konkretno dlya ciyeyi zadachi Odnak cej nedolik mozhna vipraviti zavdyaki optimizaciyi kodu velikij rozmir program cherez vikoristannya bibliotek zagalnogo priznachennya Yaksho dlya deyakoyi zadachi rozroblyati vuzkospecializovanij programnij kod to cej kod bude zajmati menshe pam yati nizh kod zagalnogo priznachennya zbilshennya skladnosti programi u vipadku nepravilnogo abo nevmilogo vikoristannya uspadkuvannya Programist zobov yazanij vmiti korektno vikoristovuvati uspadkuvannya pri pobudovi iyerarhij klasiv V inshomu vipadku ce prizvede do velikogo uskladnennyu programnogo kodu i yak rezultat zbilshennyu kilkosti pomilok skladnist zasvoyennya pochatkovimi programistami osnov pobudovi program yaki vikoristovuyut uspadkuvannya Odnak cej nedolik umovnij bo zalezhit vid dosvidu programista TerminologiyaV ob yektno oriyentovanomu programuvanni pochinayuchi z Simula 67 abstraktni tipi dannih nazivayutsya klasami angl base class ce klas yakij perebuvaye na vershini iyerarhiyi uspadkuvannya klasiv i v osnovi dereva pidklasiv tobto ne ye pidklasom i ne maye uspadkuvan vid inshih superklasiv abo interfejsiv Bazovim klasom mozhe buti abstraktnij klas i interfejs Bud yakij ne bazovij klas ye pidklasom angl superclass batkivskij klas angl parent class predok abo nadklas klas vid yakogo vikonuyetsya uspadkuvannya v pidklasah tobto klas vid yakogo spadkuyut inshi klasi Superklasom mozhe buti pidklas bazovij klas abstraktnij klas i interfejs Pidklas angl subclass pohidnij klas angl derived class dochirnij klas angl child class klas nashadok abo klas realizator klas yakij spadkuye vid superklasu abo interfejsu tobto klas viznachenij cherez uspadkuvannya vid inshogo klasu abo deyakih takih klasiv Pidklasom mozhe buti superklas Interfejs angl interface ce struktura sho viznachaye chistij interfejs klasu sho skladayetsya z abstraktnih metodiv Interfejsi berut uchast v iyerarhiyi uspadkuvannya klasiv i interfejsiv Bazovij interfejs angl base interface ce analog bazovogo klasu v iyerarhiyi uspadkuvannya interfejsiv tobto ce interfejs yakij perebuvaye na vershini iyerarhiyi uspadkuvannya Superinterfejs angl super interface abo interfejs predok ce analog superklasu v iyerarhiyi uspadkuvannya tobto vid cogo interfejsu vikonuyetsya uspadkuvannya v pidklasah i pidinterfejsah Interfejs nashadok abo pohidnij interfejs angl derived interface ce analog pidklasu v iyerarhiyi uspadkuvannya interfejsiv tobto ce interfejs yakij spadkuye vid odnogo abo dekilkoh superinterfejsiv Iyerarhiya uspadkuvannya abo iyerarhiya klasiv derevo elementami yakogo ye klasi ta interfejsi ZastosuvannyaUspadkuvannya ye mehanizmom povtornogo vikoristannya kodu angl code reuse i spriyaye nezalezhnomu rozshirennyu programnogo zabezpechennya cherez vidkriti klasi angl public classes ta interfejsi angl interfaces Vstanovlennya vidnoshennya uspadkuvannya mizh klasami porodzhuye en Tipi uspadkuvannya Proste uspadkuvannya Proste uspadkuvannya abo odinarne uspadkuvannya opisuye sporidnenist mizh dvoma klasami odin z yakih spadkuye vid inshogo Z odnogo klasu mozhe vivoditisya bagato klasiv ale navit v comu vipadku podibnij vid vzayemozvyazku zalishayetsya prostim uspadkuvannyam Abstraktni klasi i stvorennya ob yektiv Dlya deyakih mov programuvannya spravedliva nastupna koncepciya Isnuyut abstraktni klasi ogoloshuyutsya takimi dovilno abo cherez pripisani do nih abstraktni metodi yih mozhna opisuvati nayavnimi polya ta metodi Stvorennya zh ob yektiv ekzemplyariv oznachaye konkretizaciyu zastosovnu tilki do neabstraktnih klasiv v tomu chisli do neabstraktnih nashadkiv abstraktnih predstavnikami yakih v rezultati budut stvoreni ob yekti Mnozhinne uspadkuvannya Dokladnishe Mnozhinne uspadkuvannya Pri mnozhinnomu uspadkuvanni klasa mozhe mati bilsh nizh odnogo predka V comu vipadku klas uspadkovuye metodi vsih predkiv Perevagi takogo pidhodu v bilshij gnuchkosti Mnozhinne uspadkuvannya realizovano v C Z inshih mov sho nadayut cyu mozhlivist mozhna vidmititi Python i Eiffel Mnozhinne uspadkuvannya pidtrimuyetsya v movi UML Mnozhinne uspadkuvannya potencijne dzherelo pomilok yaki mozhut vinikati cherez nayavnist odnakovih imen metodiv u predkiv V movah yaki pozicionuyutsya yak spadkoyemci C Java C ta inshi bulo prijnyato rishennya vidmovitis vid mnozhinnogo uspadkuvannya na korist interfejsiv Praktichno zavzhdi mozhna obijtisya bez vikoristannya danogo mehanizmu Odnak yaksho taka neobhidnist use zh vinikla to dlya rozv yazannya konfliktiv vikoristannya uspadkovanih metodiv z odnakovimi imenami mozhlivo napriklad zastosuvati operaciyu rozshirennya vidimosti dlya vikliku konkretnogo metoda konkretnogo predka Sproba virishennya problemi nayavnosti odnakovih imen metodiv v predkah bula zdijsnena u movi Eiffel v yakij pri opisi novogo klasu neobhidno yavno vkazati importovani chleni kozhnogo z uspadkovanih klasiv i yihni imena u dochirnomu klasi Bilshist suchasnih ob yektno oriyentovanih mov programunnya C Java Delphi ta inshi pidtrimuyut mozhlivist odnochasno uspadkovuvati vid klasa predka i realizovuvati metodi dekilkoh interfejsiv odnim i tim samim klasom Cej mehanizm dozvolyaye bagato v chomu zaminiti mnozhinne uspadkuvannya metodi interfejsiv neobhidno pereviznachati yavno sho viklyuchaye pomilki pri uspadkuvanni funkcionalnosti odnakovih metodiv riznih klasiv predkiv Yedinij bazovij klasV ryadi mov programuvannya usi klasi yavno abo neyavno uspadkovuyutsya vid deyakogo bazovogo klasu Smalltalk buv odnim z pershih mov v yakih vikoristovuvalas cya koncepciya Do takih mov takozh vidnosyatsya Objective C NSObject Perl UNIVERSAL Eiffel ANY Java java lang Object C System Object Delphi TObject Scala Any Uspadkuvannya v movah programuvannyaC Uspadkuvannya v C class A Bazovij klas class B public A Public uspadkuvannya class C protected A Protected uspadkuvannya class Z private A Private uspadkuvannya V C isnuye tri tipi uspadkuvannya public protected private Specifikatori dostupu chleniv bazovogo klasu zminyuyutsya v potomkah nastupnim chinom Yaksho klas ogolosheno yak bazovij dlya inshogo klasu zi specifikatorom dostupu public public chleni bazovogo klasu dostupni yak public chleni pohidnogo klasu protected chleni bazovogo klasu dostupni yak protected chleni pohidnogo klasu protected public i protected chleni bazovogo klasu dostupni yak protected chleni pohidnogo klasu private public i protected chleni bazovogo klasu dostupni yak private chleni pohidnogo klasu Odnim z osnovnih perevag public uspadkuvannya ye te sho vkazivnik na klasi nashadki mozhe buti neyavno peretvorenij u vkazivnik na bazovij klas tobto dlya prikladu vishe mozhna napisati A a new B Cya cikava mozhlivist vidkrivaye mozhlivist dinamichnoyi identifikaciyi tipu RTTI Delphi Object Pascal Dlya vikoristannya mehanizmu nasliduvannya v Delphi neobhidno v ogolosheni klasu v duzhkah class vkazati klas predok Predok TAncestor class private protected public Virtualna procedura procedure VirtualProcedure virtual abstract procedure StaticProcedure end Naslidnik TDescendant class TAncestor private protected public Perekrittya virtualnoyi procedury procedure VirtualProcedure override procedure StaticProcedure end Absolyutno vsi klasi v Delphi ye nashadkami klasa TObject Yaksho klas predok ne vkazan to mayetsya na uvazi sho novij klas ye pryamim nashadkom klasa TObject Mnozhinne nasliduvannya v Delphi z samogo pochatku ne pidtrimuyetsya odnak dlya tih komu bez cogo ne obijtis use zh ye taki mozhlivosti napriklad za rahunok vikoristannya klasiv pomichnikiv angl Class Helpers Python Python pidtrimuye yak odinochne tak i mnozhinne uspadkuvannya Pri dostupi do atributu pereglyad pohidnih klasiv prohidit v poryadku rozshirennya metoda angl method resolution order MRO class Ancestor1 object Predok 1 def m1 self pass class Ancestor2 object Predok 2 def m1 self pass class Descendant Ancestor1 Ancestor2 Naslidnik def m2 self pass d Descendant Inicializaciya print d class mro Poryadok rozshirennya metoda lt class main Descendant gt lt class main Ancestor1 gt lt class main Ancestor2 gt lt type object gt Z versiyi Python 2 2 v movi isnuyut klasichni klasi i novi klasi Ostanni ye nashadkami object Klasichni klasi budut pidtrimuvati vklyuchno do versiyi 2 6 ale vidaleni z movi v Python 3 0 Mnozhinne uspadkuvannya zastosovuyut u Python dlya vvedennya v osnovnij klas klasiv domishok angl mix in PHP Dlya vikoristannya mehanizma nasliduvannya v PHP neobhidno v ogoloshenni klasu pislya imeni ogoloshenogo klasu naslidnika vkazati slovo extends i im ya klasu predka class Descendant extends Ancestor U vipadku perekrittya klasom nashadkom metodiv predka dostup do metodiv predka mozhna otrimati z vikoristannyam klyuchovogo slova parent class A function example echo Viklikanij metod A example n class B extends A function example echo Viklikanij metod B example n parent example Mozhna zapobigti perekrittya klasom nashadkom metodiv predka dlya cogo neobhidno vkazati klyuchove slovo final class A final function example echo Viklikanij metod A example n class B extends A function example vikliche pomilku parent example i nikoli ne vikonayetsya Shob pri uspadkuvanni zvernutis do konstruktora batkivskogo klasu neobhidno dochirnomu klasu v konstruktori vkazati parent construct Objective C interface A NSObject void example end implementation void example NSLog Class A end interface B A void example end implementation void example NSLog Class B end V interfejsi ogoloshuyut metodi yaki bude vidno zzovni klasu public Vnutrishni metodi mozhna realizovuvati bez interfejsu Dlya ogoloshennya dodatkovih vlastivostej koristuyutsya interface extension u fajli realizaciyi Usi metodi v Objective C virtualni Java Priklad uspadkuvannya vid odnogo klasu i dvoh interfejsiv public class A public interface I1 public interface I2 public class B extends A implements I1 I2 Direktiva final v ogolosheni klasa robit uspadkuvannya vid nogo nemozhlivim C Priklad uspadkuvannya vid odnogo klasu i dvoh interfejsiv public class A public interface I1 public interface I2 public class B A I1 I2 Uspadkuvannya vid tipizovanih klasiv mozhna zdijsnyuvati vkazavshi fiksovanij tip abo shlyahom perenosu zminnoyi tipu v uspadkovanij klas public class A lt T gt public class B A lt int gt public class B2 lt T gt A lt T gt Dopuskayetsya takozh uspadkuvannya vkladenih klasiv vid klasiv yaki yih mistyat class A default class A is internal not public class B can not be public klas A za zamovchuvannyam ye vnutrishnim ne publichnij klas B ne mozhe buti publichnim class B A Direktiva sealed v ogolosheni klasa robit uspadkuvannya vid nogo nemozhlivim Ruby class Parent def public method Public method end private def private method Private method end end class Child lt Parent def public method Redefined public method end def call private method Ancestor s private method private method end end Klas Parent ye predkom dlya klasu Child v yakogo pereviznachenij metod public method child Child new child public method gt Redefined public method child call private method gt Ancestor s private method Private method Privatni metodi predka mozhna viklikati z nashadkiv JavaScript class Parent constructor data this data data publicMethod return Public Method class Child extends Parent getData return Data this data publicMethod return Redefined public method const test new Child test test getData gt Data test test publicMethod gt Redefined public method test data gt test Klas Parent ye predkom dlya klasu Child v yakogo pereviznachenij metod publicMethod V JavaScript vikoristovuyetsya prototipne uspadkuvannya Konstruktori i destruktoriV S konstruktori pri uspadkuvanni viklikayutsya pochergovo vid pershogo predka do ostannogo nashadka a destruktori navpaki vid ostannogo nashadka do pershogo predka class First public First cout lt lt gt gt First constructor lt lt endl First cout lt lt gt gt First destructor lt lt endl class Second public First public Second cout lt lt gt Second constructor lt lt endl Second cout lt lt gt Second destructor lt lt endl class Third public Second public Third cout lt lt Third constructor lt lt endl Third cout lt lt Third destructor lt lt endl vikonannya kodu Third th new Third delete th rezultat vivedennya gt gt First constructor gt Second constructor Third constructor Third destructor gt Second destructor gt gt First destructor Div takozhPolimorfizm programuvannya Inkapsulyaciya programuvannya Klas programuvannya Metodi programuvannya Polya programuvannya Interfejs programuvannya Iyerarhiya UML Princip pidstanovki Liskov Movi programuvannyaPrimitkiChto takoe obektno orientirovannoe programmirovanie ros Home Computer Science and Engineering www cse msu edu Procitovano 20 zhovtnya 2021 Ekendahl Robert 2006 Hardware verification with C a practitioner s handbook New York Springer ISBN 978 0 387 36254 0 OCLC 262687433 C Inheritance Arhiv originalu za 24 veresnya 2023 Procitovano 20 zhovtnya 2021 Python 2 2 angl C i NET Nasledovanie ros

rec-icon Рекомендовані теми
Поділіться цією статтею
Читайте безкоштовну енциклопедію і дізнайтеся про все...
Дивіться більше
Прочитайте вільну енциклопедію. Вся інформація у Вікіпедія доступна. Оплата не потрібна.
Поділіться цією статтею на
Поділіться
XXX 0C
Неділя, 02 Лютий, 2025
Слідкуйте за нами