Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИДПО_ИИИС / Лекция 5.docx
Скачиваний:
67
Добавлен:
19.05.2015
Размер:
366.51 Кб
Скачать

Перегрузка стандартных методов класса 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

Соседние файлы в папке ИДПО_ИИИС