29
.NET Framework і C# Модуль 9. Наслідування

Net framework і c# module 9

Embed Size (px)

Citation preview

Page 1: Net framework і c# module 9

.NET Framework і C#Модуль 9. Наслідування

Page 2: Net framework і c# module 9

2

В цьому модулі: Наслідування в C#; Використання ключового слова seald; Використання посилань на базовий клас; Віртуальні методи; Абстрактний клас; Аналіз базового класу Object; Упакування, розпакування (boxing, unboxing);

Andriy Gladkyy [email protected]

Page 3: Net framework і c# module 9

3

Наслідування в C#.Аналіз механізмів наслідування в C# Існує два види наслідування:

◦ Наслідування типу – тип наслідник отримує всі методи і властивості базового класу

◦ Наслідування інтерфейсу – новий тип отримує від базового класу сигнатуру методів без їх реалізації

Всі класи, для яких не вказаний базовий клас, наслідуються від класу System.Object

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

Andriy Gladkyy [email protected]

Page 4: Net framework і c# module 9

4Andriy Gladkyy [email protected]

Page 5: Net framework і c# module 9

5

Специфікатори доступу при наслідувані private – нащадок не може користуватись даними базового класу protected – дані доступні лише класам наслідникам public – дані відкриті для будь яких класів internal – дані доступні лише в межах збірки protected internal – дані доступні класам наслідникам і в межах збірки

Andriy Gladkyy [email protected]

Page 6: Net framework і c# module 9

6

Andriy Gladkyy [email protected]

Демонстрація

Page 7: Net framework і c# module 9

7

Особливості використання конструкторів при наслідувані

При створені класу-нащадка викликається цілий ряд конструкторів

Якщо в класі наслідника нам потрібно викликати конструктор базового класу, то необхідно використати ключове слово base ().

Andriy Gladkyy [email protected]

public MyClass() : base()

Page 8: Net framework і c# module 9

8

Andriy Gladkyy [email protected]

Демонстрація

Page 9: Net framework і c# module 9

9

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

При приховувані імен потрібно використовувати ключове слово new

Andriy Gladkyy [email protected]

public new void Work(){ }

Page 10: Net framework і c# module 9

10Andriy Gladkyy [email protected]

Демонстрація

Page 11: Net framework і c# module 9

11

Ключове слово base

Andriy Gladkyy [email protected]

Використовується для:◦ доступу до даних базового класу із похідного◦ для виклику метода базового класу при перевизначені його в класі насліднику. При

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

◦ При створенні конструктора класу наслідника, який повинен викликати конструктор базового класу

public virtual void Method() { }

public MyClass() : base()

Page 12: Net framework і c# module 9

12Andriy Gladkyy [email protected]

Демонстрація

Page 13: Net framework і c# module 9

13

Наслідування виключень Користувацькі класи виключень повинні наслідується від класу

ApplicationException Класи наслідники повинні як мінімум мати 4 конструктори:

◦ Один за замовчуванням;◦ Задає властивість повідомленню◦ Задає властивість Message і InnerException◦ Для серіалізації виключень

Andriy Gladkyy [email protected]

ImpossibilityOfPerformanceException : ApplicationException

Page 14: Net framework і c# module 9

14Andriy Gladkyy [email protected]

Page 15: Net framework і c# module 9

15Andriy Gladkyy [email protected]

Розглянемо класи виключень неможливості виконати роботу службовцями

Базовий клас ImpossibilityOfPerformanceException Три класи наслідники:

◦ Клас виключення, що службовець не може виконати роботу у зв’язку з тим, що зайнятий виконанням іншої роботи: EmployeeIsBusyException

◦ Клас виключення не можливості виконати роботу по причині форс-мажорних випадків: ForceMajeureException

◦ Клас виключення не можливості виконати роботу по причині недостатньої кількості ресурсів або помилки інструментів: CrunchException

Використаємо вищеописані класи в класі Employee

Page 16: Net framework і c# module 9

16Andriy Gladkyy [email protected]

Демонстрація

Page 17: Net framework і c# module 9

17

Використання ключового слова sealed

Andriy Gladkyy [email protected]

Page 18: Net framework і c# module 9

18Andriy Gladkyy [email protected]

Демонстрація

Page 19: Net framework і c# module 9

19

Використання посилань на базовий класКоли посилання на похідний клас присвоюється

посиланню на базовий клас, ми отримуємо доступ до тих частин об’єкту, які присутні в базовому класі.

Andriy Gladkyy [email protected]

A nA = new B(23, 45)nA.Print();

Page 20: Net framework і c# module 9

20Andriy Gladkyy [email protected]

Демонстрація

Page 21: Net framework і c# module 9

21

Віртуальні методи Що таке віртуальний метод

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

Коли необхідно перевизначити властивість базового класу

Обмеження для віртуальних методів:◦ Поля і статичні методи не можуть бути оголошені як віртуальні◦ Застосування віртуальних методів дозволяє реалізувати механізм пізнього зв’язування ◦ На етапі компіляції будується лише таблиця віртуальних методів, а конкретний адрес

метода визначається на етапі виконання.

Під час виклику метода класу діють наступні правила:◦ Для віртуального методу викликається метод, який відповідає типу об’єкта, на який

вказує посилання◦ Для не віртуального методу викликається метод, що відповідає типу самого посилання.

Andriy Gladkyy [email protected]

Page 22: Net framework і c# module 9

22

Віртуальні методи

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

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

Це дозволяє підтримувати динамічний поліморфізм.

Andriy Gladkyy [email protected]

Page 23: Net framework і c# module 9

23

Віртуальні методи

Перевизначеня віртуальних методів Для того щоб перевизначити метод в класі-насліднику потрібно

використати ключове слово override.

Andriy Gladkyy [email protected]

public override string ToString(){ //……..}

Page 24: Net framework і c# module 9

24Andriy Gladkyy [email protected]

Демонстрація

Page 25: Net framework і c# module 9

25

Абстрактний класи Абстрактний клас – це клас екземпляр якого створити не можна, але

його можуть наслідувати інші класи

Andriy Gladkyy [email protected]

public abstract class Employee{ public virtual void Work();}

Page 26: Net framework і c# module 9

26Andriy Gladkyy [email protected]

Демонстрація

Page 27: Net framework і c# module 9

27

Аналіз базового класу object Так як кожний тип в C# наслідує клас object, то його методи будуть

доступні для будь якого класу

Andriy Gladkyy [email protected]

Метод Призначення

public virtual bool Equals (object ob1)

В якості параметра отримує об’єкт типу object. Повертає true, якщо об’єкт, що викликає метод, і об’єкт, що передається в якості параметра, однакові. Інакше повертає false.

public static bool Equals (object ob1, object ob2)

В якості параметра отримує два об’єкта типу object. Повертає true, якщо об’єкти однакові, інакше повертає false.

protected Finalize () Діє як збирач сміття. Цей метод використовують для очищення ресурсів, які займає тип посилання.

public virtual int GetHashCode()

Повертає хеш-код викликаючого об’єкта

public Type GetType() Повертає тип викликаючого об’єкта

protected object MemberwiseClone()

Створює копію викликаючого об’єкта, в яку копіюються всі члени класу, але при цьому не копіюються об’єкти, на які посилаються ці члени

public static bool ReferanceEquals (object ob1, object ob2)

Повертає true, якщо об’єкти ob1 і ob2 посилаються на один і той самий об’єкт. Якщо вони посилаються на різні об’єкти то, повертається false.

public virtual string ToString()

Викликає рядок, який описує викликаючий об’єкт

Page 28: Net framework і c# module 9

28

Пакування, розпакування (boxing, unboxing)

Так як кожний тип в C# наслідує клас object, то , будь який тип можна привести до типу object, і навпаки.

Процес упакування відбувається не явно При розпаковці потрібно виконувати явне приведення типів:

◦ Точно знати тип упакованої зміни◦ Створити зміну необхідного типу і присвоїти їй приведене до цього типу запаковану

змінну.

Andriy Gladkyy [email protected]

object ob1;int x = 12;ob1 = x; //boxingint a = (int)ob1; //unboxing

Page 29: Net framework і c# module 9

29

Розробити абстрактний клас Vehicle (транспортний засіб). На його основі реалізувати класи Plane (літак) Car (автомобіль) Ship (судно). Класи повинні мати можливість задавати і отримувати координати і параметри засобів пересування (вартість, швидкість, рік випуску і т.д.) за допомогою властивостей.Для літака повинна бути визначена висота, для літака і судна – кількість пасажирів, для корабля – порт приписки. Динамічні характеристики задавати за допомогою методів. Створити метод для роздруківки стану транспортного засобу (кількість пасажир, порт, аеропорт і т.д.)

Andriy Gladkyy [email protected]