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

Визначення нового класу (породжений клас, підклас, англ. 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.
Див. також[ред. | ред. код]
- Поліморфізм (програмування)
- Інкапсуляція (програмування)
- Клас (програмування)
- Онтологія
- Ієрархія
- UML
- Принцип підстановки Лісков
|