
- •Создание консольного проекта про c#
- •Выполнение проекта по умолчанию после "большого взрыва"
- •Проект WindowsHello
- •Структура класса c#
- •Создание объектов и их инициализация
- •Вынесение класса с точкой входа в отдельный файл
- •Инициализация членов без конструктора
- •Типы данных в c#
- •Общие сравнения структурных и ссылочных типов
- •Базовый тип System.Object
- •Перегрузка стандартных методов класса System.Object
- •Перегрузка (замещение) виртуального метода ToString()
- •Статические методы класса System.Object
- •Системные типы данных и их псевдонимы как встроенные типы c#
Перегрузка стандартных методов класса System.Object
Перегружать в производном классе можно только методы, объявленные в базовом классе как виртуальные с префиксом virtual. Перегружаемый метод должен маркироваться ключевым словом override.
Методы, которые наследуются типами от базового класса System.Object, иногда могут не устраивать пользователя (программиста) при разработке своих типов. Поэтому может возникнуть необходимость перегружать некоторые из них. Покажем это на примерах.
Перегрузка (замещение) виртуального метода ToString()
Разработаем класс Person, в котором перегрузим метод ToString() так, чтобы он выдавал не имя класса, а внутреннее состояние объекта, из которого он вызывается.
Перегрузим, также, метод Equals() базового класса. Вспомним, что он возвращает значение true в случае, если сравниваемые ссылки указывают на один и тот же объект оперативной памяти. Пусть этот метод возвращает true, если у сравниваемых объектов одинакового типа совпадает внутреннее состояние, т.е. значения всех внутренних переменных совпадают.
Если мы перегружаем метод Equals(), то обязательно нужно перегрузить и сопутствующий ему метод GetHashCode(). Если етого не сделать, то компилятор выдаст предупреждение. Метод GetHashCode() возвражает числовое значение уникального идентификатора ID объекта в памяти. Чаще всего это значение используется в коллекциях, работающих с хэшами объектов. Нам достаточно применить эту функцию к любой переменной типа, производного от базового класса System.Object. Но любые встроенные в C# типы происходят от этого базового класса.
using System;
namespace Test
{
//**********************************************************************
// Класс, хранящий информацию о человеке
//**********************************************************************
class Person
{
//******************************************
// Закрытые (private) данные о человеке
//******************************************
string Name;// ФИО
string Inn; // Номер налогоплательщика
int Age; // Возраст
//******************************************
// Конструкторы
//******************************************
public Person(){} // Пустой конструктор по умолчанию
//******************************************
public Person(string name, string inn, int age)
{
Name = name;
Inn = inn;
Age = age;
}
//******************************************
// Сервисы
//******************************************
public void Set(string name, string inn, int age)
{
Name = name;
Inn = inn;
Age = age;
}
//******************************************
public string GetName()
{
return Name;
}
//******************************************
public string GetInn()
{
return Inn;
}
//******************************************
public int GetAge()
{
return Age;
}
//******************************************
// Перегрузка библиотечного метода ToString(),
// унаследованного от класса System.Object
//******************************************
public override string ToString()
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("Ф.И.О. = " + this.Name);
sb.Append("\nИНН = " + this.Inn);
sb.Append("\nВозраст = " + this.Age);
return sb.ToString ();// Генерируется автоматически
}
//******************************************
// Перегрузка библиотечного метода Equals(),
// унаследованного от класса System.Object
//******************************************
public override bool Equals(object obj)
{
Person tmp = (Person) obj; // Создаем еще одну ссылку
// Проверяем совпадения значений переменных
// текущего объекта this и переданного объекта obj
if(tmp.Name == this.Name &&
tmp.Inn == this.Inn &&
tmp.Age == this.Age)
return true;
else
return false;
}
//******************************************
// Перегрузка библиотечного метода GetHashCode(),
// связанного с методом Equals()
//******************************************
public override int GetHashCode()
{
// Применяем к переменной Inn производного типа string
return Inn.GetHashCode();
}
}
//**********************************************************************
// Клиент Main()
// Точка входа в приложение
//**********************************************************************
class App
{
static void Main()
{
// Создаем два объекта с одинаковыми состояниями
Person person1 = new Person("Серега Жук",
"2222-33-5555", 21);
Person person2 = new Person("Серега Жук",
"2222-33-5555", 21);
Console.WriteLine("Прервая проверка для
одинаковых объектов");
// Используем замещенный для сравнения внутренного сотояния метод Equals()
if(person1.Equals(person2) && person1.GetHashCode() ==
person2.GetHashCode())
Console.WriteLine("Состояние объектов person1 и
person2 совпадает");
else
Console.WriteLine("Состояние объектов person1 и
person2 несовпадает");
// Меняем состояние одного из объектов
person2.Set("Андрей Косенок",
"1111-22-4444", 22);
Console.WriteLine("\nПовторная проверка для
различающихся объектов");
// Используем замещенный для сравнения внутренного
сотояния метод Equals()
if(person1.Equals(person2) && person1.GetHashCode() ==
person2.GetHashCode())
Console.WriteLine("Состояние объектов person1 и
person2 совпадает");
else
Console.WriteLine("Состояние объектов person1 и
person2 несовпадает");
// Теперь используем замещенный (перегруженный) метод ToString()
Console.WriteLine("\nСодержимое объекта person1");
Console.WriteLine(person1.ToString());
Console.WriteLine("\nСодержимое объекта person2");
// Метод WriteLine() сам автоматически вызывает метод ToString()
Console.WriteLine(person2);
while(true);
}
}
}
Листинг 20.19 . Демонстрация перегруженных методов класса System.Object
Результаты экрана
Прервая проверка для одинаковых объектов
Состояние объектов person1 и person2 совпадает
Повторная проверка для различающихся объектов
Состояние объектов person1 и person2 несовпадает
Содержимое объекта person1
Ф.И.О. = Серега Жук
ИНН = 2222-33-5555
Возраст = 21
Содержимое объекта person2
Ф.И.О. = Андрей Косенок
ИНН = 1111-22-4444
Возраст = 22