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

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

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace pr253_1
{
    // Класс с целочисленным полем:
    class MyClass {
        // Целочисленное поле: 
        public int code;
        // Конструктор: 
        public MyClass(int n) { 
            code=n;
        }
        // Переопределение метода ToString(): 
        public override string ToString() { 
            return "поле = " + code;
        }
        // Операторный метод для преобразования объекта к 
        // целочисленному типу:
        public static implicit operator int(MyClass obj) { 
            return obj.code;
        }
        // Операторный метод для преобразования целого числа 
        // в объект:
        public static implicit operator MyClass(int n) { 
            return new MyClass(n);
        }
    }

    // Класс с главным методом: 
    class Program
    {
        // Обобщенный метод (с аргументом обобщенного типа): 
            static void show<T>(T arg) {
                // Обобщенный параметр:
                Console.WriteLine("Обобщенный параметр: {0}", typeof(T).Name);
                // Значение аргумента:
                Console.WriteLine("Значение аргумента: {0}", arg);
                Console.WriteLine("	");
            }
        // Главный метод: 
        static void Main() {
            // Вызов обобщенных методов:
            show(100);
            show<int>(200);
            show<double>(300);
            show<MyClass>(400);
            show('A');
            show<char>('B');
            show<int>('C');
            show("Alpha");
            MyClass obj = new MyClass(500); // Создание объекта
            show(obj);
            show<int>(obj);
            // Задержка:
            Console.ReadLine();
        }
    }
}
Архив проекта можно взять здесь.

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


Рис.1. Результат работы приложения

    В этой программе мы описываем самый обычный класс MyClass, объект которого мы планируем передавать статическому обобщенному методу. В классе описано целочисленное поле code, его значение определяется аргументом конструктора. Метод ToString() переопределен для класса так, что результатом возвращается текстовая строка со значением поля code. Еще в классе определены два операторных метода. Один определяет способ неявного преобразования объекта в целое число (в этом случае результатом является значение поля code объекта), а другой метод определят способ преобразования целого числа в объект (результатом операции является ссылка на вновь созданный объект, а значение поля code объекта определяется исходным целочисленным значением).

    В классе с главным методом описан обобщенный статический метод show(). У метода один обобщенный параметр (обозначен как T). При вызове метода в консольном окне отображаются значение обобщенного параметра и значение аргумента. Значение обобщенного параметра определяется инструкцией typeof(T).Name.

    В главном методе программы метод show() вызывается с несколькими аргументами, в том числе и с аргументом, являющимся объектом класса MyClass (при отображении значения аргумента, когда аргументом является объект класса MyClass, вызывается метод ToString()). Например, при выполнении команды

  show(100);
обобщенный тип определяется по типу переданного методу аргумента (целое число). В команде
  show<int>(200);
значение для обобщенного типа указано явно. Здесь значение для обобщенного типа совпадает со значением аргумента метода. В команде
  show<double>(300);
это не так: аргумент является целым числом, а для обобщенного типа указано значение double. Но поскольку существует автоматическое приведение типов и оно применимо для преобразования типа int в тип double, то команда является корректной. Похожая ситуация имеет место и в отношении команды
  show<MyClass>(400);    , 
в которой аргументом является целое число, а для обобщенного параметра указано значение MyClass. Но поскольку в классе MyClass определен метод для неявного преобразования объектов этого класса в целочисленные значения, то команда также является корректной.

    Команды

  show('A');
и
  show<char>('B');
особых комментариев не требуют. В команде
  show<int>('C');
для обобщенного типа указано значение int, хотя аргумент относится к типу char. Как и в предыдущих аналогичных случаях, в игру вступает автоматическое приведение типа (значение типа char преобразуется в значение типа int).

    При выполнении команды

  show("Alpha");
в качестве обобщенного типа используется класс String. Наконец, в команде
  show(obj);
аргументом методу передается объект obj класса MyClass, поэтому в качестве обобщенного типа используется класс MyClass. А вот в команде
  show<int>(obj);
аргумент метода хотя и является объектом класса MyClass, но значение для обобщенного типа указано явно, поэтому будет задействовано автоматическое преобразование объекта класса MyClass к целочисленному значению. Благо, мы описали в классе MyClass соответствующий операторный метод.

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




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