II КЛАСИ Порівняльний аналіз мов C++ та C# ПРОГРАМУВАННЯ 2 курс, ф-т КІБЕРНЕТИКИ Омельчук Л. Л. 1
Класи Визначення класів в C# подібне до визначення класів в C++. Класи можуть містити наступні компоненти: конструктори, деструктори, константи, поля, методи, властивості, індексатори, оператори, події, делегати, класи, інтерфейси, структури. Приклад class Test { //елементи класу } На відміну від C++, в C# допустимим є лише одиночне наслідування. Тобто, клас може наслідувати реалізацію лише одного базового класу. Проте, клас може реалізовувати декілька інтерфейсів. ПРОГРАМУВАННЯ 2 курс, ф-т КІБЕРНЕТИКИ Омельчук Л. Л. 2
Класи (продовження) Кожен член характеризується своїм рівнем доступу. В C# розрізняють п’ять можливих рівнів доступу: public – доступ не обмежений; protected – доступ дозволено лише для класа, який містить член, та похідних цього класа; internal – доступ дозволено лише для відповідної програми; protected internal – доступ дозволено лише для відповідної програми і похідних того типа, який містить цей член; private – доступ дозволено лише для класа, що містить член. Типи оголошень в класі без модифікатора по замовчуванню private. ПРОГРАМУВАННЯ 2 курс, ф-т КІБЕРНЕТИКИ Омельчук Л. Л. 3
Конструктори та деструктори Конструктори. Синтаксис конструкторів в C# аналогічний до C++. В C#, як і в C++, якщо не описати конструктор класа, то буде автоматично створено конструктор по замовчуванню, який ініціалізує всі поля їх значеннями по замовчуванню. Деструктори використовуються для знищення екземплярів класів. В структурах визначення деструкторів неможливо. Вони застосовуються лише в класах. Клас може мати лише один деструктор. Деструктори не можуть наслідуватися чи перевантажуватися. Деструктори неможливо викликати, вони запускаються автоматично. Деструктор не має параметрів та не приймає модифікатори. ПРОГРАМУВАННЯ 2 курс, ф-т КІБЕРНЕТИКИ Омельчук Л. Л. 4
Конструктори та деструктори Мова C# розрахована на роботу в середовищі зі збірником сміття, а тому не потребує керування пам’яттю в тому обсязі, який потрібен був в C++. Збірник сміття платформи. NET Framework неявним чином керує виділенням та звільненням пам’яті для об’єктів. Проте, при інкапсуляції програмою некеруємих ресурсів, наприклад вікон, файлів, мережевих підключень, для їх звільнення слід використовувати деструктори. Якщо об’єкт потребує знищення, то збірник сміття запускає виконання методу Finalize цього об’єкта. У випадку коли програма використовує цінний зовнішній ресурс, також рекомендується забезпечити спосіб звільнення цього ресурсу явним чином, перш ніж збірник сміття звільнить цей об’єкт. Для цього слід реалізувати метод Dispose інтерфейсу IDispose. В C# використовується інший синтаксис для звільнення некеруємих ресурсів. ПРОГРАМУВАННЯ 2 курс, ф-т КІБЕРНЕТИКИ Омельчук Л. Л. 5
Конструктори та деструктори Приклад class First { ~First() { System. Diagnostics. Trace. Write. Line("Перший деструктор"); } } class Second : First { ~Second() { System. Diagnostics. Trace. Write. Line("Другий деструктор"); } } ПРОГРАМУВАННЯ 2 курс, ф-т КІБЕРНЕТИКИ Омельчук Л. Л. 6
Конструктори та деструктори class Third : Second { ~Third() { System. Diagnostics. Trace. Write. Line("Третій деструктор"); } } class Test. Destructors { static void Main() { /*створення екземпляра найдальшого в ланцюжку наслідування класа */ Third t = new Third(); } } /* Порядок виклику деструкторів: Третій деструктор. Другий деструктор. Перший деструктор */ ПРОГРАМУВАННЯ 2 курс, ф-т КІБЕРНЕТИКИ Омельчук Л. Л. 7
Константи В C++ директива #define, як правило, використовується для оголошення значень констант. В C# директиву #define з цією метою неможна використовувати. Для визначення констант в C# слід використовувати порядкові типи (лише з цілими значеннями) чи статичні елементи класа чи структури. При наявності декількох констант доцільно створити для них окремий клас Constants. В оголошенні константи не допускається модифікатор static. Приклад public const int c 1 = 5; public const int c 2 = c 1 + 5; ПРОГРАМУВАННЯ 2 курс, ф-т КІБЕРНЕТИКИ Омельчук Л. Л. 8
Методи Визначення та призначення методів в C# подібне до C++. Методи мають список формальних параметрів (можливо порожній), повертаєме значення (якщо повертаємим типом не є void). Методи можуть бути статичними та нестатичними. Статичні методи доступні на класі вцілому, а не на екземплярі класу. Вони мають доступ лише до статичних членів класу. Для оголошення статичних методів використовується модифікатор static. Нестатичні методи доступні через екземпляри класу. В C# підтримується ключове слово base для виклику перевизначених членів базового класу з класів нащадків. Крім того, в C# явним чином виконується перевизначення віртуальних та абстрактних методів за допомогою ключового слова override. ПРОГРАМУВАННЯ 2 курс, ф-т КІБЕРНЕТИКИ Омельчук Л. Л. 9
public class A Методи { protected string info = "Інформація"; public virtual void Get. Info() { Console. Write. Line("Інформація: {0}", info); } } class B : A { public string str = "ABC 567 EFG"; public override void Get. Info() {// Calling the base class Get. Info method: base. Get. Info(); Console. Write. Line("Рядок: {0}", str); } ПРОГРАМУВАННЯ 2 курс, ф-т КІБЕРНЕТИКИ } Омельчук Л. Л. 10
Методи class Test. Class { static void Main() { B E = new B(); E. Get. Info(); } } /* На виході надруковано: Інформація Рядок: ABC 567 EFG */ ПРОГРАМУВАННЯ 2 курс, ф-т КІБЕРНЕТИКИ Омельчук Л. Л. 11
Методи Для того, щоб в C# неявним чином приховати успадковані члени потрібно використовувати модифікатор new. Приклад ? . 9. public class A { public int x; public void Invoke() { } } public class B : A { new public void Invoke() { } } ПРОГРАМУВАННЯ 2 курс, ф-т КІБЕРНЕТИКИ Омельчук Л. Л. 12
Властивість – це член класу, що забезпечують гнучкий спосіб для читання, запису чи обчислення значень полів. Властивості можна використовувати так, ніби вони є відкритими членами даних, хоча насправді вони є спеціальними методами доступу. Це забезпечує простий рівень доступу до даних та дозволяє підвищити рівень безпеки та гнучкості методів. Метод get повертає значення, а метод set його присвоює. Приклад class Square т/*квадрат*/ { private double side; /*довжина сторони*/ public double Area /*площа*/ { get { return side * side; } set { side = Math. Sqrt(value); } } ПРОГРАМУВАННЯ 2 курс, ф-т КІБЕРНЕТИКИ 13 Омельчук Л. Л. }
Властивість class Program { static void Main() { Square t = new Square (); // Призначення властивості площі ініціює виклик методу set t. Area = 25; // Звернення до властивості Area ініціює виклик методу get System. Console. Write. Line("Площа квадрата: " + t. Area); } } // На виході маємо: Площа квадрата: 25 ПРОГРАМУВАННЯ 2 курс, ф-т КІБЕРНЕТИКИ Омельчук Л. Л. 14
Індексатори дозволяють індексувати екземпляри класа чи структури подібно до масивів. Індексатори нагадують властивості, але їх методи доступу приймають параметри. Для визначення індексаторів використовується ключове слово this. Для визначення, що присвоєно методом set використовується ключове слово value. ПРОГРАМУВАННЯ 2 курс, ф-т КІБЕРНЕТИКИ Омельчук Л. Л. 15
Індексатори Приклад class My. Collection
Події являть собою члени, що забезпечують об’єкту чи класу можливість надсилати повідомлення. Клас визначає подію за допомогою оголошення події (яку задає тип делегата). ПРОГРАМУВАННЯ 2 курс, ф-т КІБЕРНЕТИКИ Омельчук Л. Л. 17
Делегати В C# делегати дозволяють використовувати функціональність, подібну до функціональності покажчиків на функціїв C++. На відміну від покажчиків, делегати забезпечують типову безпеку (є строго типізованими) та об’єктно-орієнтований підхід. Оголошення делегата визначає деякий клас, похідний від класу System. Delegate. Оголошення типу делегата аналогічно підпису метода. Воно має повертаєме значення та деяку кількість параметрів. Використовується для оголошення типу посилання, який може бути використаний для інкапсуляції іменованого чи анонімного методу. ПРОГРАМУВАННЯ 2 курс, ф-т КІБЕРНЕТИКИ Омельчук Л. Л. 18
Делегати Приклад /* Оголошення делегата (визначає необхідну сигнатуру): */ delegate double Math. Action(double num); class Delegate. Test { /* Статичний метод 1, що відповідає сигнатурі/* static double Double. Action(double input) { return input * 2; } // Метод, що відповідає сигнатурі static double Square. Action(double input) { return input * input; } static void Main() { /* Створення екземплярів делегаті з іменами методів*/ Math. Action ma 1 = Double. Action; Math. Action ma 2 = Square. Action; // Виклик делегата ma 1: double mult. By. Two = ma 1(4. 5); Console. Write. Line(mult. By. Two); // Виклик делегата ma 2: double power. Of. Two = ma 2(4. 5); Console. Write. Line(power. Of. Two); /*Створення екземпляра делегата з анонімним методом: */ Math. Action ma 3 = delegate(double input) { return input * input; }; double cube = ma 3(5); Console. Write. Line(cube); } } 19 ПРОГРАМУВАННЯ 2 курс, ф-т КІБЕРНЕТИКИ Омельчук Л. Л.
Інтерфейси Інтерфейс використовується для визначення контракта. Контракт інтерфейса — це гарантія об’єкта в тому, що він буде подтримувати всі елементи даного інтерфейса. Цей контракт створюється за допомогою ключевого слова Interface, що оголошує тип посилання, який інкапсулює контракт. Класс чи структура, що реалізують інтерфейс, повинні виконувати контракт, інакше виникає помилка. Інтерфейси містить лише підписи методів, властивостей, подій чи індексаторів. Таким чином, на відміну від наслідування інтерфейси не дають готову реалізацію методів, а лише гарантують, що зовнішній світ може працювати з класом, який реалізує інтерфейс IA, як з IA, при цьому кожен клас повинен сам його реалізувати. ПРОГРАМУВАННЯ 2 курс, ф-т КІБЕРНЕТИКИ Омельчук Л. Л. 20
Інтерфейси Інтерфейс може наслідувати від одного чи декількох базових інтерфейсів. Якщо в списку базових типів міститься базовий клас та інтерфейси, то базовий клас мусить стояти в списку на першому місці. В класах C# може бути реалізовано довільна кількість інтерфейсів, але наслідуватися вони можуть лише від одного базового класу. Загальноприйнятою практикою є назви інтерфейсів починати великою літерою I. ПРОГРАМУВАННЯ 2 курс, ф-т КІБЕРНЕТИКИ Омельчук Л. Л. 21
Інтерфейси Приклад //оголошення інтерфейса interface IMy. Interface { void My. Method(); } //оголошення класа, який реалізує інтерфейс IMy. Interface class Implementation. Class : IMy. Interface { // Реалізація метода My. Method інтерфейса IMy. Interface: void IMy. Interface. My. Method() { // Реалізація } static void Main() { // Оголошення інтерфейсного елемента IMy. Interface obj = new Implementation. Class(); // Виклик метода obj. My. Method(); } } ПРОГРАМУВАННЯ 2 курс, ф-т КІБЕРНЕТИКИ 22 Омельчук Л. Л.