Новини високих технологій
» » ООП, об'єкти, класи. Спадкування і інтерфейси

ООП, об'єкти, класи. Спадкування і інтерфейси

30-01-2019, 11:14
1 146
Починаючи писати програму, сучасний розробник насамперед повинен продумати архітектуру майбутнього проекту. З точки зору об'єктно-орієнтованого підходу до розробки програмного забезпечення, це означає, що програміст повинен створити код, який буде складатися з логічних блоків (класів і об'єктів), і продумати їх взаємодія. Код повинен бути підтримуваним. Це означає, що в надалі дану програму можна буде безболісно доповнити або розширити, не змінюючи її основні складові.
В об'єктно-орієнтованій парадигмі розробки існують три основних інструменти, якими користуються розробники для написання гарного коду: Інкапсуляція. Спадкування. Поліморфізм. Спадкування.

Спадкування

Це процес створення нового класу на основі вже існуючого. Об'єктно-орієнтований підхід насамперед застосовується для того, щоб описати поняття і явища реального світу мовою програмування. Тому, щоб зрозуміти ООП, необхідно навчитися описувати завдання, що стоїть перед програмістом, мовою класів і об'єктів.


Для того, щоб зрозуміти суть процесу спадкування, можна навести приклад з життя. Існує абстрактне поняття «людина». У кожної людини є загальні характеристики, якими його можна описати. Це зріст, вага, колір волосся, тембр голосу, і так далі. Іванов Іван, учень 1 класу «А» — це конкретний представник поняття «людина», тобто, висловлюючись мовою об'єктно-орієнтованого підходу, поняття Іванов Іван — спадкоємець поняття людина. Або, приміром, сусідський кіт Барсик — спадкоємець поняття «кіт». Можна скласти більш складне спадкування: поняття Барсик успадковується від поняття мейн-кун, яке в свою чергу успадковується від поняття «кіт».


Як це описується мовою програмування?

В розробці програмного забезпечення процес спадкування дає можливість створювати клас на основі інших. Клас-батько називається базовим, а решта-спадкоємці — це похідні. Запозичення полягає в тому, що нащадкам переходять методи, властивості і поля батьків. Синтаксис успадкування класів в мові програмування C# може виглядати наступним чином. Наприклад:

class Ivan : Person
{
//тіло класу
{

Приклад механізму успадкування класів:

  class Person 
{
public int Age {get; set;}
}
class Ivan : Person
{
public void Talk()
{
//Іван розмовляє
}
}
class Peter : Person
{
public void Walk()
{
//Петро йде
}
}
class Program
{
static void Main(string[]args)
{
Ivan ivan = new Ivan();
ivan.Age = 29; //позначаємо вік
Peter peter = new Peter();
peter.Age = 35
ivan.Talk();
peter.Walk()();
}
}

На основі базового класу Person створюються класи-спадкоємці, і властивість Age доступно для обох класів.

Конструктор базового класу

Створюючи клас з оголошеним конструктором і клас-спадкоємець, виникає логічне питання: які конструктори за що будуть відповідати при створенні об'єктів цих класів?

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

Якщо ж конструктори задані і в батьківському, і в дочірньому класах, то для виклику базового використовується ключове слово base. При оголошенні такої структури успадкування завдання конструктора застосовується наступний синтаксис:


<script type="text/jаvascript">
var blockSettings2 = {blockId:"R-A-271049-5",renderTo:"yandex_rtb_R-A-70350-39",async:!0};
if(document.cookie.indexOf("abmatch=") >= 0) blockSettings2.statId = 70350;
!function(a,b,c,d,e){a[c]=a[c]||[],a[c].push(function(){Ya.Context.AdvManager.render(blockSettings2)}),e=b.getElementsByTagName("script")[0],d=b.createElement("script"),d.type="text/jаvascript",d.src="//an.yandex.ru/system/context.js",d.async=!0e.parentNode.insertBefore(d,e)}(this,this.document,"yandexContextAsyncCallbacks");
  public Ivan (int age) : base (age) 
{
//тіло конструктора
}

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

Доступ до полів з дочірнього класу

Спадкування доступу до властивостей і методів базового класу з класу-спадкоємця стає можливим, якщо всі вони оголошуються з наступними ключовими словами:

1. Public.

Надає необмежений доступ до членів класу: Main, із класів-спадкоємців, з інших аналогів.

2. Protected.

Доступ до члена залишається тільки з початкового класу, або з похідних аналогів.

3. Internal.

Обмеження до члена локалізовано лише даної складанням проекту.

4. Protected internal.

Обмеження до члена лімітовано тільки даної складанням проекту або з похідних класів.

Спадкування доступу до членів класу залежить від ключових слів. Якщо при оголошенні члена як таке не вказано, то доступність встановлюється за замовчуванням (private).

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

Інтерфейси — це контракт, що надає гарантії, що набір методів буде реалізований в класі-спадкоємці інтерфейсу. Останні не містять статичних членів, полів, констант, або конструкторів. Нелогічно і не можна створювати об'єкти інтерфейсу.


<script type="text/jаvascript">
var blockSettings3 = {blockId:"R-A-271049-6",renderTo:"yandex_rtb_R-A-70350-44",async:!0};
if(document.cookie.indexOf("abmatch=") >= 0) blockSettings3.statId = 70350;
!function(a,b,c,d,e){a[c]=a[c]||[],a[c].push(function(){Ya.Context.AdvManager.render(blockSettings3)}),e=b.getElementsByTagName("script")[0],d=b.createElement("script"),d.type="text/jаvascript",d.src="//an.yandex.ru/system/context.js",d.async=!0e.parentNode.insertBefore(d,e)}(this,this.document,"yandexContextAsyncCallbacks");

Дані структури створюються за межами класів, оголошуються, використовуючи ключове слово interface:

  interface IMyInterfave 
{
void MyMethod (int someVar);
}

Правило хорошого тону при створенні інтерфейсів — починати ім'я конструкції з великої літери I, щоб надалі їх легше було розрізняти. У тілі інтерфейсу оголошуються сигнатури його членів.

Для вказівки того, що клас буде реалізовувати інтерфейс, необхідно так само, як і зазвичай при спадкуванні, вказати ім'я конструкції після оголошення класу:

  class MyClass : IMyInterface 
{
public void MyMethod (int someVar)
}

Інтерфейси необхідні для того, щоб реалізовувати множинне спадкування. В мові програмування С++, ножественное спадкування класів можливо; в мові C# для цих цілей використовуються інтерфейси. Клас може реалізовувати численна кількість інтерфейсів, в такому випадку вони перераховуються через кому після оголошення класу:

class MyClass : IMyFirstInterface, IMySecondInterface
{
//тіло класу
}


За замовчуванням всі властивості і методи інтерфейсів мають доступ public, тому що повинні визначати якийсь функціонал, який надалі буде реалізований в класі. Спадкування в C# майже завжди включає в себе використання цього зручного інструменту.

Ще трохи про спадкування класів

Java, С#, С++ - все об'єктно-орієнтовані мови по-своєму реалізують механізм спадкування. Але суть скрізь одна: передати властивості батька об'єкту-нащадку. Інтерфейси, абстрактні класи - це всі зручні інструменти для втілення цього завдання.
Цікаво по темі
Об'єктно-орієнтований підхід в програмуванні: поняття, застосування і розробка
Об'єктно-орієнтований підхід в програмуванні: поняття, застосування і розробка
Першими мовами програмування були імперативні мови, або машинні інструкції (коди). Вони складалися з двійкового коду, який відрізнявся в залежності
Логічний тип даних в інформатиці
Логічний тип даних в інформатиці
Типів даних в інформатиці безліч. Вони поділяються на посилальні типи і типи значень. Типи значень працюють зазвичай швидше, тому що зберігаються в
Перевантаження операторів в С++: основи, приклади
Перевантаження операторів в С++: основи, приклади
У будь-якій науці є стандартні позначення, які полегшують розуміння ідей. Наприклад, в математиці це множення, ділення, додавання і інші символьні
Що таке динамічні масиви C++?
Що таке динамічні масиви C++?
Визначимося для початку з тим, що таке динамічний масив. З часів Сі існують масиви, але їх особливістю був фіксований розмір, який зазначався при
Як здійснити запис у файл Java
Як здійснити запис у файл Java
При написанні програм на мові Java рано чи пізно постане необхідність читання і запису інформації в файл. Для цього в мові передбачені наступні
Елементи об'єктної моделі Java: абстрактний клас, інтерфейс
Елементи об'єктної моделі Java: абстрактний клас, інтерфейс
Головна думка абстрактного класу полягає в наступному тезі: іноді потрібні не готові класи, а в «сирому» вигляді. Такі заготовки не можна прямо