Шаг 66.
Язык программирования C#. Начала
Статические методы. Перегрузка статических методов

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

    В языке C# есть очень важный и полезный механизм, который называется перегрузкой методов. В частности, перегрузка может применяться и к статическим методам. Идея перегрузки состоит в том, что мы можем описать несколько методов с одним и тем же названием. В таком случае обычно говорят про разные версии одного и того же метода, хотя в действительности методы разные. И они должны отличаться. Поскольку именем они не отличаются, то отличаться они должны списком аргументов (количеством и/или типом аргументов). При вызове перегруженного метода (то есть метода, у которого есть несколько версий) версия, которая будет вызвана, определяется по количеству и типу аргументов, фактически переданных методу. Поэтому при перегрузке метода его разные версии должны быть описаны так, чтобы отсутствовала любая неоднозначность при вызове метода. В противном случае программа просто не скомпилируется.

    Пример, в котором используется перегрузка статических методов, представлен ниже. и Листинг 5.2. Перегрузка статических методов

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

namespace pr66_1
{
    class Program
    {
        // Версия статического метода для отображения текста 
        // (с одним текстовым аргументом): 
        static void show(string txt){
            Console.WriteLine("Текст: " + txt);
        }
        
        // Версия статического метода для отображения 
        // целого числа (аргумент метода): 
        static void show(int num){
            Console.WriteLine("Целое число: " + num);
        }

        // Версия статического метода для отображения 
        // действительного числа (аргумент метода): 
        static void show(double num) {
            Console.WriteLine("Действительное число: " + num);
        }

        // Версия статического метода для отображения символа 
        // (аргумент метода): 
        static void show(char s){ 
            Console.WriteLine("Символ: " + s);
        }

        // Версия статического метода для отображения числа 
        // (первый аргумент) и символа (второй аргумент): 
        static void show(int num, char s) {
            Console.WriteLine("Аргументы {0} и {1}", num, s);
        }

        // Главный метод программы:
        static void Main()
        {
            // Целочисленная переменная: 
            int num = 5;
            // Действительная числовая переменная: 
            double z = 12.5;
            // Символьная переменная: 
            char symb = 'W';
            // Вызываем метод с символьным аргументом: 
            show(symb);
            // Вызываем метод с текстовым аргументом: 
            show("Знакомимся с перегрузкой методов");
            // Вызываем метод с целочисленным аргументом: 
            show(num);
            // Вызываем метод с действительным аргументом: 
            show(z);
            // Вызываем метод с двумя аргументами: 
            show(num, 'Q');
            // Задержка:
            Console.ReadLine();
        }
    }
}
Архив проекта можно взять здесь.

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


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

    В представленной программе описано пять версий статического метода show():

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

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

  show(symb);
вызывается версия метода show() с одним символьным аргументом, поскольку переменная symb, переданная аргументом методу при вызове, объявлена как символьная. А вот при выполнении команды
  show (num, 'Q') 
вызывается версия метода show() с первым целочисленным аргументом и вторым символьным аргументом.


Для выбора версии метода должно совпадать не только количество аргументов, но еще и тип каждого аргумента. Допустим, в программе вместо версии метода show() с целочисленным и символьным аргументами описана версия метода show() с двумя символьными аргументами. Тогда команда
  show (num, 'Q') 
была бы некорректной, поскольку в программе не оказалось бы подходящей версии вызываемого метода. Такие программные коды не компилируются. С другой стороны, если мы опишем вместо нынешней версии метода show() с целочисленным и символьным аргументами версию метода show() с двумя целочисленными аргументами, то программа скомпилируется, и команда
  show (num, 'Q') 
выполнится так: вызывается метод show() с двумя целочисленными аргументами, и вместо символа 'Q' используется его код 81 в кодовой таблице. То есть здесь выполняется автоматическое приведение значения типа char в значение типа int. А вот обратное преобразование из типа int в тип char автоматически не выполняется, поэтому вариант метода show() с двумя символьными аргументами не сработает.

    Аналогично, если мы уберем из программы описание метода show() с целочисленным аргументом, то при выполнении команды

  show(num);
будет вызвана версия метода с double-аргументом и целочисленное значение переменной num автоматически преобразуется в значение типа double.

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




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