Выбрать главу

консольное окно с сообщениями, которые увидит пользователь.

Это общая схема создания и использования объектов и объектных пере-

менных. Теперь мы будем постепенно усовершенствовать методы работы

с объектами.

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. Такие поля являются закрытыми и недоступны

вне класса. Поэтому в программном коде класса эти поля можно