На этом шаге мы рассмотрим, что могут принимать и возвращать обобщенные методы.
Схема использования обобщенных методов не сводится лишь к передаче методам параметров разных типов. Скажем, аргументом метода может быть массив из элементов обобщенного типа или метод может подобный массив возвращать как результат. Небольшая зарисовка к сказанному представлена в программе ниже.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr255_1 { // Класс с главным методом: class Program { // Обобщенный метод с аргументом - массивом из // элементов обобщенного типа: static void show<T>(T[] array) { // Отображение значений элементов массива: for(int k = 0; k < array.Length; k++) { Console.Write("|" + array[k]); } Console.WriteLine("|"); } // Обобщенный метод возвращает результатом массив из // элементов обобщенного типа: static T[] create<T>(int n) { // Создание массива из элементов обобщенного типа: T[] array = new T[n]; // Результат метода - ссылка на массив: return array; } // Обобщенный метод для заполнения массива значениями: static void fill<T>(T[] a, T b) { // Перебираются элементы массива: for(int k = 0; k < a.Length; k++) { // Элементу массива присваивается значение: a[k] = b; } } // Обобщенный метод результатом возвращает значение // случайного элемента из массива: static T getRand<T>(T[] a, Random rnd){ // Результат метода: return a[rnd.Next(a.Length)]; } // Главный метод: static void Main() { // Создание объекта для генерирования чисел: Random rnd = new Random(); // Создание массивов: string[] A = { "one", "two", "three" }; int[] B = { 2, 3, 5, 8, 13, 21 }; char[] C = { 'c', 'h', 'a', 'r', 'l', 'i' }; // Вызов обобщенных методов: show(A); show(B); Console.WriteLine("Случайные числа:"); for (int k = 1; k <= 10; k++) { Console.Write(getRand(B, rnd) + " "); } Console.WriteLine(); show(C); Console.WriteLine("Случайные символы:"); for (int k = 1; k <= 10; k++) { Console.Write(getRand(C, rnd) + " "); } Console.WriteLine(); // Создание символьного массива вызовом метода: char[] symbs = create<char>(6); // Заполнение массива символами: fill(symbs, 'W'); // Отображение содержимого массива: show(symbs); // Создание целочисленного массива вызовом метода: int[] nums = create<int>(7); // Заполнение массива числами: fill(nums, 3); // Отображение содержимого массива: show(nums); // Задержка: Console.ReadLine(); } } }
Результат выполнения программы может (с учетом того, что используется генератор случайных чисел) быть таким:
Рис.1. Результат работы приложения
В классе с главным методом описывается несколько статических обобщенных методов. Есть метод show(), аргументом которого является массив обобщенного типа (обобщенный тип обозначен как T, а тип аргумента обозначен как T[] - то есть ссылка на массив, элементы которого относятся к типу T). Методом отображаются значения элементов массива.
Обобщенный метод create() получает в качестве аргумента целое число, а результатом возвращает массив (не заполненный) из элементов обобщенного типа. В теле метода командой
T[] array = new T[n];
Обобщенный метод fill() предназначен для заполнения массива значениями (все элементы массива получают одинаковые значения). Ссылка на массив и присваиваемое элементам массива значение передаются аргументами методу.
Наконец, в программе есть метод getRand(), который результатом возвращает значение одного из элементов массива, переданного первым аргументом методу (первый аргумент обозначен как a). Элемент выбирается случайным образом. Для этого в качестве второго аргумента методу передается ссылка на объект класса Random (второй аргумент обозначен как rnd), с помощью которого генерируется случайное число (индекс элемента). Индекс генерируется инструкцией rnd.Next(a.Length) (случайное число в диапазоне от 0 до a.Length-1 включительно). Результатом метода возвращается значение элемента с соответствующим индексом (команда return a[rnd.Next(a.Length)]).
В методе Main() создается объект rnd для генерации случайных чисел, а также три массива A (текстовый), B (целочисленный) и C (символьный). Для отображения содержимого массивов используются команды show(A), show(B) и show(C). Результатом выражения getRand(B,rnd) является значение одного из элементов (выбирается случайным образом) массива B. Аналогично результат выражения getRand(C,rnd) - это значение случайно выбранного элемента из массива C.
При выполнении команды
char[] symbs = create<char>(6);
int[] nums = create<int>(7); ,
fill(symbs, 'W');
fill(nums, 3); .
На следующем шаге мы продолжим изучение этого вопроса.