2. В цьому модулі:
Наслідування в C#;
Використання ключового слова seald;
Використання посилань на базовий клас;
Віртуальні методи;
Абстрактний клас;
Аналіз базового класу Object;
Упакування, розпакування (boxing, unboxing);
2
Andrii Hladkyi
trilobt@gmail.com
3. Наслідування в C#.
Аналіз механізмів наслідування в C#
Існує два види наслідування:
◦ Наслідування типу – тип наслідник отримує всі методи і
властивості базового класу
◦ Наслідування інтерфейсу – новий тип отримує від базового
класу сигнатуру методів без їх реалізації
Всі класи, для яких не вказаний базовий клас,
наслідуються від класу System.Object
C# не підтримує множинного наслідування. Клас в
C# може бути наслідником тільки одного класу, але
при цьому може реалізувати декілька інтерфейсів.
Andrii Hladkyi
trilobt@gmail.com 3
5. Специфікатори доступу при наслідувані
private – нащадок не може користуватись даними базового класу
protected – дані доступні лише класам наслідникам
public – дані відкриті для будь яких класів
internal – дані доступні лише в межах збірки
protected internal – дані доступні класам наслідникам і в межах збірки
Andrii Hladkyi
trilobt@gmail.com 5
7. Особливості використання конструкторів
при наслідувані
При створені класу-нащадка викликається цілий ряд
конструкторів
Якщо в класі наслідника нам потрібно викликати
конструктор базового класу, то необхідно
використати ключове слово base ().
Andrii Hladkyi
trilobt@gmail.com 7
public MyClass() : base()
9. Приховування імен при наслідувані
Приховування імен відбувається, коли в базовому класі
і в класі насліднику оголошені методи з однаковим
іменем
При приховувані імен потрібно використовувати
ключове слово new
Andrii Hladkyi
trilobt@gmail.com 9
public new void Work(){ }
11. Ключове слово base
Andrii Hladkyi
trilobt@gmail.com 11
Використовується для:
◦ доступу до даних базового класу із похідного
◦ для виклику метода базового класу при перевизначені його в класі насліднику. При
цьому метод базового класу має бути віртуальним.
◦ При створенні конструктора класу наслідника, який повинен викликати конструктор
базового класу
public virtual void Method() { }
public MyClass() : base()
13. Наслідування виключень
Користувацькі класи виключень повинні наслідується від класу
ApplicationException
Класи наслідники повинні як мінімум мати 4 конструктори:
◦ Один за замовчуванням;
◦ Задає властивість повідомленню
◦ Задає властивість Message і InnerException
◦ Для серіалізації виключень
Andrii Hladkyi
trilobt@gmail.com 13
ImpossibilityOfPerformanceException : ApplicationException
15. Andrii Hladkyi
trilobt@gmail.com 15
Розглянемо класи виключень неможливості виконати роботу
службовцями
Базовий клас ImpossibilityOfPerformanceException
Три класи наслідники:
◦ Клас виключення, що службовець не може виконати роботу у зв’язку з тим,
що зайнятий виконанням іншої роботи: EmployeeIsBusyException
◦ Клас виключення не можливості виконати роботу по причині форс-
мажорних випадків: ForceMajeureException
◦ Клас виключення не можливості виконати роботу по причині недостатньої
кількості ресурсів або помилки інструментів: CrunchException
Використаємо вищеописані класи в класі Employee
19. Використання посилань на базовий клас
Коли посилання на похідний клас присвоюється
посиланню на базовий клас, ми отримуємо доступ
до тих частин об’єкту, які присутні в базовому класі.
Andrii Hladkyi
trilobt@gmail.com 19
A nA = new B(23, 45)
nA.Print();
21. Віртуальні методи
Що таке віртуальний метод
Коли необхідно перевизначити метод базового класу в класі
наслідника
Коли необхідно перевизначити властивість базового класу
Обмеження для віртуальних методів:
◦ Поля і статичні методи не можуть бути оголошені як віртуальні
◦ Застосування віртуальних методів дозволяє реалізувати механізм пізнього зв’язування
◦ На етапі компіляції будується лише таблиця віртуальних методів, а конкретний адрес
метода визначається на етапі виконання.
Під час виклику метода класу діють наступні правила:
◦ Для віртуального методу викликається метод, який відповідає типу об’єкта, на який
вказує посилання
◦ Для не віртуального методу викликається метод, що відповідає типу самого посилання.
Andrii Hladkyi
trilobt@gmail.com 21
22. Віртуальні методи
Необхідність використання віртуальних методів
Віртуальні методи дозволяють визначити в базовому класі методи,
реалізація яких є загальною для всіх похідних класів і методи, які
можна перевизначити.
Це дозволяє підтримувати динамічний поліморфізм.
Andrii Hladkyi
trilobt@gmail.com 22
23. Віртуальні методи
Перевизначеня віртуальних методів
Для того щоб перевизначити метод в класі-насліднику потрібно
використати ключове слово override.
Andrii Hladkyi
trilobt@gmail.com 23
public override string ToString()
{
//……..
}
25. Абстрактний класи
Абстрактний клас – це клас екземпляр якого створити не можна, але його
можуть наслідувати інші класи
Andrii Hladkyi
trilobt@gmail.com 25
public abstract class Employee
{
public abstract void Work();
}
27. Аналіз базового класу object
Так як кожний тип в C# наслідує клас object, то його методи будуть
доступні для будь якого класу
Andrii Hladkyi
trilobt@gmail.com 27
Метод Призначення
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()
Викликає рядок, який описує викликаючий об’єкт
28. Пакування, розпакування (boxing,
unboxing)
Так як кожний тип в C# наслідує клас object, то , будь який тип можна
привести до типу object, і навпаки.
Процес упакування відбувається не явно
При розпаковці потрібно виконувати явне приведення типів:
◦ Точно знати тип упакованої зміни
◦ Створити зміну необхідного типу і присвоїти їй приведене до цього типу запаковану
змінну.
Andrii Hladkyi
trilobt@gmail.com 28
object ob1;
int x = 12;
ob1 = x; //boxing
int a = (int)ob1; //unboxing
29. Розробити абстрактний клас Vehicle (транспортний засіб). На його основі
реалізувати класи Plane (літак) Car (автомобіль) Ship (судно). Класи
повинні мати можливість задавати і отримувати координати і параметри
засобів пересування (вартість, швидкість, рік випуску і т.д.) за допомогою
властивостей.
Для літака повинна бути визначена висота, для літака і судна – кількість
пасажирів, для корабля – порт приписки. Динамічні характеристики
задавати за допомогою методів. Створити метод для роздруківки стану
транспортного засобу (кількість пасажир, порт, аеропорт і т.д.)
Andrii Hladkyi
trilobt@gmail.com 29