синтаксиса. Это классика жанра — для ссылки на поле name объекта cat мы указываем имя объекта и, через точку, имя поля. Присваиваемое полю
значение указано справа от оператора присваивания. По-другому мы по-
ступаем с объектом dog. Для этого командой dog.SetName("Шарик") из объ-
екта dog вызывается метод SetName() с текстовым аргументом, который
присваивается полю name этого объекта. Здесь мы также имеем дело с то-
чечным синтаксисом.
ПРИМЕЧАНИЕ Обратите внимание на то, что в соответствии с кодом метода SetName() в консоль выводится сообщение о присвоении значения
полю name.
Кульминацией программы являются команды cat.ShowName() и dog.Show
Name(), которыми в консоль выводятся сообщения о значении полей name соответствующих объектов.
Напоминаем, что команда Console.ReadLine() нужна исключительно
для того, чтобы окно консоли не закрылось сразу по выполнении
предыдущих инструкций.
Результат выполнения программы представлен на рис. 2.1, где показано
консольное окно с сообщениями, которые увидит пользователь.
Это общая схема создания и использования объектов и объектных пере-
менных. Теперь мы будем постепенно усовершенствовать методы работы
с объектами.
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()) перегружается. Для этого метода опи-
сано четыре различных версии: с двумя аргументами, без аргументов, с од-
ним текстовым аргументом и одним целочисленным аргументом.