Помощь в написании студенческих работ
Антистрессовый сервис

Обобщенные делегаты. 
Программирование. 
Базовый курс с#

РефератПомощь в написанииУзнать стоимостьмоей работы

В библиотеку стандартных классов платформы .NET Framework включено семейство обобщенных типов делегатов, наиболее важными из которых для конечного пользователя являются Func и Action. Их назначение — обеспечить программиста обобщенными делегатами, которые можно применять в программах без предварительного явного объявления. Каждый из названных обобщенных делегатов перегружен, так что… Читать ещё >

Обобщенные делегаты. Программирование. Базовый курс с# (реферат, курсовая, диплом, контрольная)

Как и у обобщенных методов, у обобщенных делегатов имеется два списка параметров — список типизирующих параметров и список параметров методов, которые может представлять делегат. Но у делегата нет тела, и этим обобщенный делегат похож на прототип обобщенного метода.

В качестве примера приведем обобщенный делегат с одним типизирующим параметром:

delegate R DelMin (R х, R у);

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

В следующем классе Program два статических метода, каждый из которых возвращает минимальное из значений своих аргументов и может быть представлен обобщенным делегатом. Метод minl () соответствует делегату DelMin, а метод minL () — делегату DelMin.

class Program.

{

static int minl (int a, int b).

{

return a > b? b: a;

}

static long minL (long a, long b).

{

return a > b? b: a;

}

static void Main ().

{

int first = 5, second = 6, third = 7;

DelMin dI2 = new DelMin (minI);

DelMin dL2 = new DelMin (minL);

Console.WriteLine (dL2(dI2(first, dI2(second, third)), -3L));

} }

В методе Main () объявлены два экземпляра (dI2 и dL2) конкретизаций DelMin и DelMin обобщенного делегата DelMin. Экземпляры делегатов представляют методы minl () и minL (). В аргументе метода Console. WriteLineO выражение с вложенными обращениями к экземплярам делегатов вычисляет минимальное из значений трех переменных типа int и одной константы -3L типа long. Результат, конечно, равен -3. Обратите внимание, что возвращаемые значения метода minl () имеют тип int, а аргументы метода minL () должны иметь тип long. Соответствующие приведения типов при обращениях к этим методам с помощью делегатов выполняются по умолчанию (что не имеет отношения ни к делегатам, ни к их обобщениям, а связано с автоматическим преобразованием арифметических типов языка С#).

В библиотеку стандартных классов платформы .NET Framework включено семейство обобщенных типов делегатов, наиболее важными из которых для конечного пользователя являются Func и Action. Их назначение — обеспечить программиста обобщенными делегатами, которые можно применять в программах без предварительного явного объявления. Каждый из названных обобщенных делегатов перегружен, так что в пространстве имен System есть обобщенные типы делегатов с разным количеством типизирующих параметров. Для обобщенных делегатов Func можно использовать от 1 до 17 типизирующих параметров. В каждом из этих семнадцати обобщенных типов последний из типизирующих параметров определяет тип возвращаемого значения тех методов, которые представляет соответствующий делегат. Объявления первых трех обобщенных типов делегатов Func из библиотеки .NET имеют такой вид:

delegate TResult Func ();

delegate TResult Func (T1 tl);

delegate TResult Func (Tl tl, T2 t2);

Реализации первого из перечисленных обобщенных типов делегатов предназначены для представления методов без параметров, возвращающих значение типа, определяемого единственным типизирующим аргументом конкретного делегата. Например, метод с заголовком double method () может быть представлен экземпляром делегата Func. Метод с заголовком int count (int[] arr) может быть представлен экземпляром делегата Func и т. д.

В отличие от делегатов Func о делегаты Action о предназначены для представления методов, не имеющих возвращаемого значения, т. е. методов, для которых в качестве типа возвращаемого результата указывается void. Таких обобщенных типов делегатов в библиотеке шестнадцать с количеством типизирующих параметров от 1 до 16:

delegate void Action (Tl tl);

delegate void Action (Tl tl, T2 t2);

delegate void Action (Tl tl, T2 t2, T3 t3);

Например, метод с заголовком void printArray (float [] arr) может быть представлен экземпляром делегата Action .

Зная о существовании этих двух семейств обобщенных типов делегатов и о том, что они известны в пространстве имен System, программист в ряде случаев может не включать в код собственное объявление типа делегата. Например, если в программе нужен тип.

delegate int Processor (string line, char ch).

экземпляры которого могут представлять методы с параметрами типов string и char, возвращающие значение типа int, можно использовать Func .

Следующая программа иллюстрирует применение библиотечных обобщенных типов делегатов Func о и Action о. Необходимо написать метод для формирования массива из заданного количества значений членов ряда Фибоначчи и обобщенный метод для вывода в консольное окно значений элементов одномерного массива. В основной программе объявить два экземпляра делегатов (Funcо и Actiono) для представления указанных методов и, используя эти экземпляры делегатов, вывести значения первых семи членов ряда Фибоначчи:

// Обобщенные делегаты .NET и обобщенный метод using System;

class Program.

{

static void printArray (T[] ar, string format).

{

foreach (T z in ar).

Console.Write (format, z);

Console.WriteLine ();

} // printArray () static int[] fib (int numb).

{

int[] ar = new int[numb]; ar[0] = ar[l] = 1; for (int к = 2; к < numb; k++) ar[k] = ar[k — 1] + ar[k — 2]; return ar;

}

static void Main ().

{

Action act =.

new Action (printArray);

Funccint, int[]> result = new Funccint, int[]>(fib); act (fib (7), «{0} «);

} }

Результаты выполнения программы:

1 1 2 3 5 8 13.

Обобщенный метод printArray () для вывода значений элементов массива мы уже приводили. В этой программе он немного изменен — исключено умалчиваемое значение второго параметра, а в теле метода для перебора элементов массива применен цикл foreach. Для представления такого метода можно использовать экземпляр реализации обобщенного делегата Action. Обратите внимание, что второй параметр обобщенного метода printArray () не типизирован и имеет фиксированный тип string.

Метод для создания массива со значениями членов ряда Фибоначчи fib (int numb) особенностей не имеет. Параметр определяет число членов ряда, возвращаемый результат — ссылка на создаваемый массив. Для представления такого метода можно использовать экземпляр реализации обобщенного делегата FunccTl, TResult>.

В основной программе (в методе Main) ссылка Action<int [], string> act связана с экземпляром делегата, представляющим конкретизацию метода printArray (). Первый типизирующий аргумент int [] обобщенного делегата Action определяет тип первого параметра метода.

void printArray (T[] ar, string format).

а второй типизирующий аргумент соответствует фиксированному типу второго параметра метода. Ссылка Funccint, int[] > result связана с экземпляром делегата, представляющим метод int [] fib (int numb). После объявления указанных ссылок на экземпляры делегатов выражение act (fib (7)," {0} «) обеспечивает обращение к конкретизации метода printArray (), который в свою очередь вызывает метод fib (int numb).

Контрольные вопросы и задания

  • 1. Назовите языки программирования, в которых тем или иным способом реализован механизм обобщений.
  • 2. Какие типы языка C# могут объявляться как обобщенные?
  • 3. Какие члены типов языка C# могут быть обобщенными?
  • 4. Назовите обязательные элементы декларации (объявления) обобщенного класса.
  • 5. Что такое типизирующий параметр?
  • 6. Каково назначение типизирующих аргументов в обозначении специализированного типа?
  • 7. Что такое сконструированный тип?
  • 8. В чем отличия сконструированного типа от регулярного типа?
  • 9. Назовите требования к именам типизирующих параметров.
  • 10. Объясните назначение раздела ограничений типизирующих параметров в декларации обобщенного типа и обобщенного метода.
  • 11. Какой формат имеет элемент списка ограничений типизирующих параметров?
  • 12. Назовите виды ограничений типизирующего параметра.
  • 13. Что такое свободные типизирующие параметры?
  • 14. Перечислите требования к свободным типизирующим параметрам.
  • 15. Когда применяется ограничение с помощью явного указания типа?
  • 16. Назовите ранги и правила использования разных форм ограничений типизирующих параметров.
  • 17. Объясните правила перегрузки обобщенных типов.
  • 18. Почему обобщенный тип называют открытым типом, а сконструированный — закрытым?
  • 19. Назовите особенности статических членов обобщенных типов.
  • 20. Что определяют типизирующие параметры обобщенного интерфейса?
  • 21. Как реализуется обобщенный интерфейс регулярным типом и обобщенным типом?
  • 22. Как реализуется регулярным типом несколько сконструированных интерфейсов?
  • 23. Назовите типы, не допускающие обобщений.
  • 24. Приведите формат объявления обобщенного метода.
  • 25. Что такое инстанцирование обобщенного метода?
  • 26. Перечислите элементы объявления обобщенного типа делегата.
  • 27. Что определяют типизирующие параметры обобщенного типа делегата?
  • 28. Назовите имена обобщенных типов делегатов, входящих в библиотеку классов .NET.
Показать весь текст
Заполнить форму текущей работой