Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие КНЕУ.doc
Скачиваний:
24
Добавлен:
07.03.2016
Размер:
3.9 Mб
Скачать

9.8. Рекомендації по програмуванню

Інтерфейси найчастіше використовуються для завдання загальних властивостей об'єктів різних ієрархій. Основна ідея інтерфейсу полягає в тому, що до об'єктів класів, що реалізовують інтерфейс, можна звертатися однаковим чином. При цьому кожен клас може визначати елементи інтерфейсу по-своєму.

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

У С# підтримується одиночне спадкоємство для класів і множинне - для інтерфейсів. Це дозволяє додати похідному класу властивості декількох базових інтерфейсів. Клас повинен визначати всі методи всіх інтерфейсів, які є в списку його предків.

У бібліотеці .NET визначена велика кількість стандартних інтерфейсів. Реалізація стандартних інтерфейсів у власних класах дозволяє використовувати для об'єктів цих класів стандартні засоби мови і бібліотеки.

Наприклад, для забезпечення можливості сортування об'єктів стандартними методами слід реалізувати у відповідному класі інтерфейси IComparable або IComparer. Реалізація інтерфейсів IEnumerable і IEnumerator дає можливість проглядати вміст об'єкту за допомогою конструкції foreach, а реалізація інтерфейсу ICloneable - клонувати об'єкти.

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

Сфера застосування структур - типи даних, що мають невелику кількість полів, з якими зручніше працювати як із значеннями, а не як з посиланнями. Накладні витрати на динамічне виділення пам'яті для екземплярів невеликих класів можуть значно понизити швидкодію програми, тому їх ефективніше описувати як структури.

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

Розділ 10. Делегати, події і потоки виконання

У цьому розділі розглядаються делегати і події - два взаємозв'язані засоби мови С#, що дозволяють організувати ефективну взаємодію об'єктів. Крім того приводяться початкові відомості про розробку багатопотокових застосувань.

10.1. Делегати

Делегат - це вид класу, призначений для зберігання посилань на методи. Делегат можна передати як параметр, а потім викликати інкапсульований в ньому метод. Делегати використовуються для підтримки подій, а також як самостійна конструкція мови. Розглянемо спочатку другий випадок.

10.1.1. Опис делегатів

Опис делегата задає сигнатуру методів, які можуть бути викликані з його допомогою:

[ атрибути ] [ специфікатори ] delegate тип ім'я_делегата ([ параметри ])

Специфікатори делегата мають той же сенс, що і для класу, причому допускаються тільки специфікатори new, public, protected, internal і private.

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

Приклад опису делегата: public delegate void D (int i );

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

Делегат, як і всякий клас, є типом даних. Його базовим класом є клас System.Delegate, що забезпечує свого “нащадка” деякими корисними елементами, які ми розглянемо пізніше. Успадковувати від делегата не можна.

Оголошення делегата можна розміщувати безпосередньо в просторі імен або усередині класу.