Net framework і c# module 7_old

Preview:

Citation preview

.NET Framework і C#Модуль 7. Перевантаження

операторів

В цьому модулі: Введення в перевантаження операторів;

Перевантаження унарних операторів;

Перевантаження бінарних операторів;

Перевантаження операторів відношення;

Перевантаження логічних операторів;

Перевантаження операторів true і false;

Перевантаження операторів перетворення;

2Andrey Gladky KspDevelop@gmail.com

Введення в перевантаження операторів Перевантаження операторів дозволяє вказати як, стандартні

оператори будуть використовуватись з об’єктами класу.

Перевантаження операторів використовується для покращення

читання програм.

Вимоги до перевантаження операторів:

• перевантаження операторів повинно виконуватись відкритими

статичними методами класу.

• у метода - оператора тип повертаючого значення або одного із

параметрів повинен співпадати з типом, в якому виконується

перевантаження операторів.

• параметри метода - оператора не повинні містити модифікатор out і

ref.

Andrey Gladky KspDevelop@gmail.com 3

Andrey Gladky KspDevelop@gmail.com 4

Також як і з C++ в C# перевантаження операторів має деякі

обмеження:

• перевантаження не може змінити приорітет операторів

• при перевантажені не можна змінити число операндів, з

якими працює оператор

• не всі оператори можуть перевантажуватись

Оператори що допускають перевантаження

Andrey Gladky KspDevelop@gmail.com 5

Оператор Опис

- Зміна знака змінної

! Операція логічного заперечення

~ Операція побітового доповнення, яка призводить до

інверсії кожного біта

++, -- Інкримент і декримент

true, false Критерій істинності об’єкта, визначається

розробником класу

+, -, *, /, % Арифметичні оператори

&, |, ^, <<, >> Бітові операції

==, !=, <, >, <=, >= Оператори порівняння

&&, || Логічні оператори

[] Операції доступу до елементів масиву,

моделюються за рахунок індексаторів

() Операції перетворення

Оператори що не допускають перевантаження

Andrey Gladky KspDevelop@gmail.com 6

Оператор Опис

+=, -=, *=, /=,%=, &=,

|=, ^=, <<=, >>=

Перевантажуються автоматично при

перевантаженні відповідних бінарних операторів

= Присвоєння

. Доступ до члену типу

?: Оператора умови

new Створення об’єкта

as, is,typeof Використовується для отримання інформації про

тип

->, sizeof, *, & Доступні лише в небезпечному коді

Синтаксис перевантаження:

public static <тип результату> operator <символ операції>

(параметри)

Перевантаження унарних операторів

Унарні оператори отримують лише один операнд

Повинен мати тип класу, в якому виконується перевантаження

Andrey Gladky KspDevelop@gmail.com 7

public static class_name operator ++ (class_name cn)

{

//...

}

Andrey Gladky KspDevelop@gmail.com 8

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

Перевантаження бінарних операторів

Andrey Gladky KspDevelop@gmail.com 9

public static class_name operator + (class_name cn, args)

{

//...

}

Andrey Gladky KspDevelop@gmail.com 10

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

Перевантаження операторів відношення Операції порівняння перевантажуються парами

== і !=

< i >

<= i >=

При перевантаженні операторів відношення потрібно враховувати, що

є два способи перевірки на рівність

Рівність посилань

Рівність значень

В класі object визначені наступні методи порівняння об’єктів

Andrey Gladky KspDevelop@gmail.com 11

public static bool ReferenceEquals(Object obj1, Object obj2)

Public bool virtual Equals(Object obj)

Andrey Gladky KspDevelop@gmail.com 12

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

Перевантаження операторів true,

false

Andrey Gladky KspDevelop@gmail.com 13

Під час перевантаження операторів true і false розробник задає

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

Перевантаження виконується за наступними правилами:

◦ Оператор true повинен повертати true, якщо стан об’єкта істинний і false якщо інакше

◦ Оператор false повинен повертати true, якщо стан об’єкта хибний і false якщо інакше

◦ Оператори true і false потрібно перевантажувати в парі

При цьому можлива ситуація, коли стан не являється ні істинним ні

хибним – обидва оператори можуть повернути false.

Таблиця істинності

Значення Оператор True Оператор False

1 true false

-1 false true

0 false false

Andrey Gladky KspDevelop@gmail.com 14

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

Перевантаження логічних операторів Умовні логічні оператори && і || не можна перевантажити, але вони

обчислюються за допомогою & і |, що допускають перевантаження.

Таблиця істинності

Andrey Gladky KspDevelop@gmail.com 15

Операнд1 Операнд2 & |

True True True True

False True False True

Null True Null True

True False False True

False False False False

Null False False Null

True Null Null True

False Null False Null

Null Null Null Null

Andrey Gladky KspDevelop@gmail.com 16

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

Перевантаження операторів перетворення Приведення може бути двох типів

◦ Із довільного типу в власний тип

◦ Із власного типу в довільний

Приведення типів може виконуватись явним і не явним способом:

◦ implicit – задає не явне перетворення, можна використовувати, якщо перетворення

завжди безпечне

◦ explicit – задає явне перетворення, варто використовувати, якщо можлива втрата даних

Andrey Gladky KspDevelop@gmail.com 17

public static {implicit / explicit} operator цільовий тип (вихідний тип)

{

//….

}

Andrey Gladky KspDevelop@gmail.com 18

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

Створити клас який буде містити два масиви

(множини). Перевантажити оператори +, *, -,

таким чином щоб можна було б виконати

наступні операції над множинами:

• перетин множин – тобто повернути множину С усіх

елементів, що належать як множині А, так і множині

B (*)

• об’єднання множин – тобто повернути множину С,

що складається з усіх елементів, які належать хоча б

одній із цих множин (+)

• різниці множин – тобто повернути множина С, яка

складається з усіх елементів, які належать множні А

і не належать множині В.(-)

Andrey Gladky KspDevelop@gmail.com 19

Recommended