Відкрити головне меню

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

Зміст

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

Визначення нового класу (породжений клас, підклас, англ. derived class, англ. subclass) може базуватись на визначенні вже існуючого (базовий клас, англ. base class, англ. superclass). В такому випадку, новий клас отримає властивості та поведінку базового класу, та доповнить їх своїми власними. У випадку одиничного успадкування, у кожного класу може бути лише один безпосередній базовий клас. У випадку множинного успадкування, дозволяється існування декількох безпосередніх надкласів.

Представником мови, яка має явне множинне успадкування є C++. Оскільки при множинному успадкуванні виникає ряд проблем, тому у таких мовах, як наприклад D, Java, C# дозволяють явно тільки просте (одинарне) успадкування. У разі необхідності, у даних мовах множинне успадкування можна реалізувати за допомогою інтерфейсів.

Застосування механізму успадкування дозволяє покращити повторне використання коду шляхом використання вже визначених властивостей та методів (поведінки) базових класів.

Приклад на C#Редагувати

Приклад на мові C# (консольна програма), в якій показується наслідування класу Class2 (subclass) у класу Class1 (superclass):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Class1 c1 = new Class1();   // створюємо об'єкт Class1
            c1.some_pub_var2 = 1;
            c1.some_pub_func();

            Class2 c2 = new Class2();   // створюємо об'єкт Class2, який успадковує всі відкриті методи та поля Class1
            c2.some_pub_var2 = 1;       // як бачимо, в Class2 є поле some_pub_var2 із Class1 (успадкування)
            c2.some_pub_var3 = 2;       // це поле доступне тільки у Class2
            c2.some_pub_func();         // цей метод також успадкувався з Class1 

            Console.ReadLine();
        }
    }

    class Class1
    {
        private int some_priv_var1;     // деяке приватне тестове поле
        public int some_pub_var2;       // деяке загальнодоступне(публічне) поле

        private void some_priv_func()   // приватний метод
        {
            Console.WriteLine("Call some_priv_func!");
        }
        public void some_pub_func()     // загальнодоступний метод
        {
            Console.WriteLine("Call some_pub_func!");
        }
    }

    class Class2 : Class1   // Class2 успадковує властивості класу Class1
    {
        public int some_pub_var3;       // публічна змінна (доступна тільки для Class2)
    }

}

Приклад С++Редагувати

#include <iostream>
using namespace std;
 
class FirstClass    // базовий клас
{
protected:          // специфікатор доступу
    int value;
public:
    FirstClass()
    {
        value = 0;
    }
 
    FirstClass( int input )
    {
        value = input;
    }
 
    void show_value()
    {
        cout << value << endl;
    }
};
 
class SecondClass : public FirstClass   // похідний клас
{
public:
    SecondClass() : FirstClass ()   // конструктор класу SecondClass викликає конструктор класу FirstClass
    {}
 
    SecondClass(int inputS) : FirstClass (inputS)   // inputS передається в конструктор з параметром класу FirstClass
    {}
 
    void ValueSqr () // підносить value до квадрату. Без специфікатора доступа protected ця функція не могла б змінити значення value
    {
        value *= value;    
    }  
};
 
int main()
{
    setlocale(LC_ALL, "ukr");
 
    FirstClass F_object(3);     // об'єкт базового класу
    cout << "value F_object = ";
    F_object.show_value();
 
    SecondClass S_object(4);    // об'єкт похідного класу
    cout << "value S_object = ";
    S_object.show_value();  // виклик методу базового класу
 
    S_object.ValueSqr();        // value до квадрату
    cout << "квадрат value S_object = ";
    S_object.show_value();
 
    //F_object.ValueSqr();      // базовий клас не має доступу до методів похідного класу
 
    cout << endl;
    return 0;
}

Джерела інформаціїРедагувати

  • Grady Booch (2007). Object-oriented analysis and design with applications (вид. друге). Addison-Wesley. ISBN 0-201-89551-X. 

Див. такожРедагувати