Шаг 255.
Язык программирования C#. Начала.
Обобщенные типы. Обобщенные методы (и еще продолжение)

    На этом шаге мы рассмотрим, что могут принимать и возвращать обобщенные методы.

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

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];
создается массив из n (целочисленный аргумент метода) элементов типа T (обобщенный параметр). Ссылка на этот массив возвращается результатом метода (команда return array).

    Обобщенный метод 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);
создается символьный массив из 6 (аргумент метода create()) элементов, и ссылка на массив записывается в переменную symbs. В данном случае мы явно указали значение char для обобщенного параметра, поскольку по аргументу метода create() автоматически определить значение обобщенного параметра не получится. В силу той же причины значение int для обобщенного параметра явно указывается в команде
  int[] nums = create<int>(7);     , 
которой создается целочисленный массив из 7 элементов. Ссылка на массив записывается в переменную nums. Для заполнения массивов используем команды
  fill(symbs, 'W');
и
  fill(nums, 3);          . 
Отображается содержимое массивов с помощью метода show().

    На следующем шаге мы продолжим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг