Функції вищих порядків
Одне з найбільш важливих застосувань делегатів пов'язано з функціями вищих порядків. Функцією вищого порядку називається така функція (метод) класу, у якій один або кілька аргументів належать до функціонального типу. Без цих функцій в програмуванні обійтися досить важко. Класичним прикладом є функція обчислення інтеграла, у якій один з аргументів задає підінтегральної функції. Іншим прикладом може служити функція. сортує об'єкти. Аргументом її є функція Compare. порівнює два об'єкти. Залежно від того, яка функція порівняння буде передана на вхід функції сортування, об'єкти будуть сортуватися по-різному, наприклад, на ім'я, або по ключу, або по декількох полях. Варіантів може бути багато, і вони визначаються класом, що описує сортовані об'єкти.
обчислення інтеграла
Давайте більш детально розглянемо ситуацію з функціями вищого порядку на прикладі задачі обчислення певного інтеграла із заданою точністю. З цією метою створимо клас, в якому буде описаний делегат. визначає контракт. Якому повинні задовольняти підінтегральної функції. У цьому ж класі визначимо метод, що обчислює інтеграл. По суті самого завдання цей метод являє собою функцію вищого порядку. Наведу програмний код, що описує клас:
- Клас HighOrderIntegral призначений для роботи з функціями. У нього вкладено опис функціонального класу - делегата SubIntegralFun. задає клас функцій з одним аргументом типу double і повертають значення цього ж типу.
- Метод EvalIntegral - основний метод класу дозволяє обчислювати визначений інтеграл. Цей метод є функція вищого порядку. оскільки одним з його аргументів є подинтегральная функція, що належить класу SubIntegralFun.
- Для обчислення інтеграла застосовується класична схема. Інтервал інтегрування розбивається на n частин, і обчислюється часткова сума за методом трапецій. представляє наближене значення інтеграла. Потім n подвоюється, і обчислюється нова сума. Якщо різниця двох наближень по модулю менше заданої точності eps. то обчислення інтеграла закінчується, інакше процес повторюється в циклі. Цикл завершується або по досягненні заданої точності, або коли n досягне деякого граничного значення (в нашому випадку - 2 15).
- Обчислення часткової суми інтеграла за методом трапецій реалізовано закритою процедурою I.
- Згодом клас може бути розширений, і крім обчислення інтеграла він може обчислювати і інші характеристики функцій.
Щоб продемонструвати роботу з класом HighOrderIntegral. приведу ще клас Functions. де описано кілька функцій, що задовольняють контрактом. який заданий класом SubIntegralFun:
А тепер розглянемо метод класу клієнта, виконує створення потрібних об'єктів і тестує їх роботу: