
lec_07_16.pptx
- Количество слайдов: 13
Застосування віртуальних методів n Віртуальні методи використовуються: n під час роботи з похідним класами через вказівник на базовий клас; n під час передачі об'єктів в методи як параметри: В параметрах метода описується об'єкт базового типу, а під час виклику в неї передається об'єкт похідного класу. Віртуальні методи, що викликаються для параметра методу, будуть відповідати типу аргументу, а не параметра. Методи, що працюють з поліморфними об'єктами, називають поліморфними. 1
Приклад поліморфного метода Якийсь. Метод ( Т t ) { t. draw(); … } n Т - предок n Х - потомок n в обох класах є віртуальний метод draw n T t = new T(10); n X x = new X(20); n Якийсь. Метод( t ) викликається draw з Т n Якийсь. Метод( x ) викликається draw з X 2
n Під час опису класів рекомендується визначати як віртуальні ті методи, які в похідних класах повинні бути реалізовані по-іншому. n Якщо в усіх класах ієрархії метод буде виконуватися однаково, то його краще визначити як звичайний метод. 3
Абстрактні класи n Абстрактні класи служать для представлення загальних понять, які передбачається конкретизувати в похідних класах. n Абстрактний клас задає інтерфейс для всієї ієрархії. n Абстрактний клас задає набір методів, який кожен з потомків буде реалізовувати по-своєму. n Методи абстрактного класу можуть мати порожнє тіло (описуються як abstract). n Абстрактний клас може містити і повністю визначені методи (на відміну від інтерфейсу). n Якщо в класі є хоча б один абстрактний метод, то весь клас повинен бути описаний як abstract. n Якщо клас, похідний від абстрактного, не перевизначає всі абстрактні методи, то він також повинен описуватися як абстрактний. 4
Застосування абстрактних класів n Абстрактний клас служить тільки для породження потомків. n Абстрактні класи використовуються: n під час роботи зі структурами даних, що потрібні для збереження об'єктів однієї ієрархії n як параметри поліморфних методів n Mетоду, параметром якого є абстрактний клас, під час виконання програми можна передавати об'єкт будь-якого похідного класу. n Це дозволяє створювати поліморфні методи, що працюють з об'єктом будь-якого типу в межах однієї ієрархії. 5
Безплідні (фінальні) класи n Ключове слово sealed дозволяє описати клас, від якого, на відміну від абстрактного, успадковувати забороняється: sealed class Spirit { . . . } // class Monster : Spirit {. . . } помилка! n Більшість вбудованих типів даних описано як sealed. Якщо необхідно використовувати функціональність безплідного класу, то застосовується не спадкування, а вкладення, або включення: у класі описується поле відповідного типу. n Так як поля класу зазвичай закриті, то описують метод об'ємного класу, з якого викликається метод включеного класу. Такий спосіб взаємовідносин класів відомий як модель включення-делегування (пізніше). 6
Клас object n Кореневий клас System. Object всієї ієрархії об'єктів. NET, що називається в C# object, забезпечує всіх спадкоємців декількома важливими методами. n Похідні класи можуть використовувати ці методи безпосередньо або перевизначати їх. n Клас object використовується безпосередньо: n під час опису типу параметрів методів для надання їм загальності; n для збереження вказівників на об'єкти різного типу. 7
Відкриті методи класу System. Object public virtual bool Equals(object obj); n повертає true, якщо параметр і об'єкт, що його викликає, вказують на одну і ту ж область пам'яті public static bool Equals(object ob 1, object ob 2); n повертає true, якщо обидва параметра вказують на одну і ту же область пам'яті public virtual int Get. Hash. Code(); n формує хеш-код об'єкта і повертає число, що однозначно ідентифікує об'єкт public Type Get. Type(); n повертає поточний поліморфний тип об'єкта (не тип вказівника, а тип об'єкта, на який вона в даний момент вказує) public static bool Reference. Equals(object ob 1, object ob 2); n повертає true, якщо обидва параметра вказують на одну і ту же область пам'яті public virtual string To. String() n повертає для вказівникових типів повне ім'я класу у вигляді рядка, для значимих — значення величини, що перетворене в рядок. Цей метод перевизначають, щоб виводити інформацію про стан об'єкта. 8
Приклад перевизначення метода Equals // порівняння значень, а не вказівників public override bool Equals( object obj ) { if ( obj == null || Get. Type() != obj. Get. Type() ) return false; Monster temp = (Monster) obj; return health == temp. health && ammo == temp. ammo && name == temp. name; } public override int Get. Hash. Code() { return name. Get. Hash. Code(); } 9
Рекомендації з програмування n Головна перевага спадкування полягає у тому, що на рівні базового класу можна написати універсальний код, за допомогою якого можна також працювати з об'єктами похідного класу, що реалізується через віртуальні методи. n Як віртуальні повинні бути описані методи, які виконують в усіх класах ієрархії одну і ту же функцію, але, можливо, різними способами. n Для представлення загальних понять, які передбачається конкретизувати в похідних класах, використовують абстрактні класи. Як правило, в абстрактному класі задається набір методів, тобто інтерфейс, який кожний з потомків буде реалізовувати по-своєму. n Звичайні методи (не віртуальні) перевизначати в похідних класах не рекомендується. 10
Види взаємовідносин між класами n Спадкування n Спеціалізація (Потомок є спеціалізованою формою батька) n Специфікація (Дочірній клас реалізує поведінку, що описана у батька) n Конструювання або Варіювання (Потомок використовує методи батька, але не є його підтипом; предок і потомок є варіаціями на одну тему – наприклад, прямокутник і квадрат) n n Узагальнення (Потомок узагальнює поведінку батька) n n Розширення (В потомок додають нові методи, розширюючи поведінку батька) Обмеження (Потомок обмежує поведінку батька) Вкладення n композиція n агрегація Класифікація Тімоті Бадда 11
Спадкування і вкладення n Спадкування класу Y від класу X найчастіше означає, що Y є різновидом класу X (конкретнішу, окрему концепцію). n Вкладення є альтернативним спадкуванню механізмом використання одним класом іншого: один клас є полем іншого. n Вкладення представляє відношення класів «Y містить X» або «Y реалізується за допомогою Х» і реалізується за допомогою моделі «включення-делегування» . 12
Модель включення-делегування class Двигун {public void Запуск() {Console. Write. Line( "вжик!!!" ); }} class Літак { public Літак() { лівий = new Двигун(); правий = new Двигун(); } public void Запустити_двигуни() { лівий. Запуск(); правий. Запуск(); } Двигун лівий, правий; } class Class 1 { static void Main() { Літак АН 24_1 = new Літак(); АН 24_1. Запустити_двигуни(); } } Результат роботи програми: вжик!!! 13