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

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

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

Принцип успадкування[ред.ред. код]

InheritancePgmUML.svg

Визначення нового класу (породжений клас, підклас, англ. 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. 

Див. також[ред.ред. код]

Комп'ютер Це незавершена стаття про комп'ютери.
Ви можете допомогти проекту, виправивши або дописавши її.