консольное окно с сообщениями, которые увидит пользователь.
Это общая схема создания и использования объектов и объектных пере-
менных. Теперь мы будем постепенно усовершенствовать методы работы
с объектами.
60
Глава 2. Классы и объекты
Рис. 2.1. Результат выполнения программы, в которой использованы объекты
Перегрузка методов
Нет, такой хоккей нам не нужен!
Н. Озеров
Перегрузка методов — весьма полезный и перспективный механизм, ко-
торый позволяет создавать очень гибкие и эффективные методы. В общих
чертах суть перегрузки методов состоит в том, что в классе можно создавать
(описывать) несколько вариантов одного и того же метода. «Несколько ва-
риантов» в данном случае означает, что все эти методы имеют одинаковые
названия, но при этом различаются количеством и (или) типом аргументов.
ПРИМЕЧАНИЕ Процедура перегрузки методов есть не только в C#, но и в C++ и Java.
Во всех случаях общий подход универсален — у перегружаемых ме-
тодов одинаковые названия, но при этом разные варианты методов
должны быть различимы. В принципе идентификацию того или иного
варианта метода (поскольку у всех у них одинаковые названия) мож-
но выполнять на основе списка аргументов и (или) типа результата.
В C# такая идентификация выполняется только на основе списка
аргументов метода. У разных версий перегружаемого метода должно
быть разное количество аргументов или аргументы должны быть
разного типа. Обычно правильная фраза звучит так: «при перегрузке
метода неизменно название, но разная сигнатура». Под сигнатурой
в C# подразумевают имя метода и список его аргументов. Обратите
внимание: тип результата в понятие «сигнатура» не входит!
Реализуется перегрузка метода достаточно просто. Каждый вариант мето-
да описывается как отдельный метод. Важно только помнить, что разные
варианты должны быть различимы на уровне аргументов. Ведь количество
и тип переданных методу аргументов являются индикаторами того, какой
вариант метода необходимо вызывать в том или ином случае. Проиллю-
стрируем это на конкретном примере. Обратимся к программному коду, представленному в листинге 2.3.
Перегрузка методов 61
Листинг 2.3. Перегрузка методов
using System;
class Person{
// Закрытое числовое поле:
int age;
// Закрытое текстовое поле:
string name;
// Открытый метод для отображения полей:
public void show(){
Console.WriteLine("Имя: "+name);
Console.WriteLine("Возраст: "+age);
}
// Открытый перегруженный метод для
// присваивания значения полям.
// Версия перегруженного метода
// с двумя аргументами:
public void set(int n,string arg){
age=n;
name=arg;
}
// Версия метода без аргументов:
public void set(){
age=0;
name="Нет имени";
}
// Версия метода с одним числовым аргументом:
public void set(int n){
// Вызывается версия метода с двумя аргументами:
set(n,"Нет имени");
}
// Версия метода с одним текстовым аргументом:
public void set(string arg){
// Вызывается версия метода
// с двумя аргументами:
set(0,arg);
}
}
class PersonDemo{
// Главный метод программы:
public static void Main(){
// Создание объекта fellow класса Person:
Person fellow=new Person();
// Вызов версии метода set() с одним
// числовым аргументом:
fellow.set(100);
продолжение
62
Глава 2. Классы и объекты
Листинг 2.3 (продолжение)
// Отображение результата:
fellow.show();
// Вызов версии метода set() с одним
// текстовым аргументом:
fellow.set("Колобок");
// Отображение результата:
fellow.show();
// Вызов версии метода set() с двумя аргументами:
fellow.set(10,"Буратино");
// Отображение результата:
fellow.show();
// Вызов версии метода set() без аргументов:
fellow.set();
// Отображение результата:
fellow.show();
Console.ReadLine();
}
}
Перегруженный метод находим в классе Person. У класса два поля (цело-
численное age и текстовое string) и два метода (show() и set()) — правда, один из этих методов (метод set()) перегружается. Для этого метода опи-
сано четыре различных версии: с двумя аргументами, без аргументов, с од-
ним текстовым аргументом и одним целочисленным аргументом.
ПРИМЕЧАНИЕ Поля у класса тоже не очень простые. Они описаны без ключе-
вого слова public. Такие поля являются закрытыми и недоступны
вне класса. Поэтому в программном коде класса эти поля можно