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

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

    Примечателен и тот факт, что обобщенные методы можно перегружать: в программе может быть несколько версий обобщенного метода. Как это делается на практике, показано в примере ниже.

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

namespace pr256_1
{
    // Главный класс:
    class Program
    {
        // Первая версия метода: 
        static void show<T>(T a) {
            Console.WriteLine("Bepcия №1"); 
            Console.WriteLine("Аргумент: {0}", a);
        }
        // Вторая версия метода: 
        static void show(int a) {
            Console.WriteLine("Bepcия №2"); 
            Console.WriteLine("Числo: {0}", a);
        }
        // Третья версия метода: 
        static void show<T, U>(T a, U b) {
            Console.WriteLine("Bepcия №3"); 
            Console.WriteLine("Первый: {0}", a); 
            Console.WriteLine("Второй: {0}", b);
        }
        // Четвертая версия метода: 
        static void show<T>(T a, int b) {
            Console.WriteLine("Bepcия №4"); 
            Console.WriteLine("Первый: {0}", a); 
            Console.WriteLine("Число:  {0}", b);
        }

        // Главный метод:
        static void Main()
        {
            // Вызов обобщенного метода:
            show('A');
            show(123);
            show<int>('A');
            show<int>(123);
            show('B', "Bravo");
            show('C', 321);
            show<char, int>('C', 321);
            // Задержка:
            Console.ReadLine();
        }
    }
}
Архив проекта можно взять здесь.

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


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

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

    В главном методе метод show() вызывается с разными аргументами. При выполнении команды

  show('A');
однозначно вызывается обобщенный метод с одним аргументом. А вот при выполнении команды
  show(123);
появляется некоторая интрига относительно версии метода, которую следует вызвать (обобщенный метод с одним аргументом или обычный метод с целочисленным аргументом). Приоритет остается за обычной версией метода. Но если мы при вызове метода в угловых скобках укажем значение для обобщенного параметра (как в команде
  show<int>(123);
), то будет вызван обобщенный метод. Аналогичная ситуация имеет место и в случае передачи двух аргументов методу show(). При выполнении команды
  show('B', "Bravo");
вариантов, кроме как вызывать метод с двумя аргументами обобщенного типа, нет.

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

  show('C', 321);
вызывается версия метода, в которой второй аргумент описан как обычный целочисленный аргумент. Если же мы указываем в угловых скобках значения для обобщенных параметров (команда
  show<char, int>('C', 321);
), то вызывается версия метода с двумя аргументами обобщенного типа.


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

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




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