Корневой класс System.Object всей иерархии объектов.NET, называемый в С# object, обеспечивает всех наследников несколькими важными методами. Производные классы могут использовать эти методы непосредственно или переопределять их.
Класс object часто используется и непосредственно при описании типа параметров методов для придания им общности, а также для хранения ссылок на объекты различного типа — таким образом реализуется полиморфизм. Открытые методы класса System.Object перечислены ниже.
□ Метод Equals с одним параметром возвращает значение true, если параметр
и вызывающий объект ссылаются на одну и ту же область памяти. Син
таксис:
public virtual bool Equals(object obj);
□ Метод Equals с двумя параметрами возвращает значение true, если оба пара
метра ссылаются на одну и ту же область памяти. Синтаксис:
public static bool Equals(object ob1, object ob2);
□ Метод GetHashCode формирует хеш-код объекта и возвращает число, однознач
но идентифицирующее объект. Это число используется в различных структу
рах и алгоритмах библиотеки. Если переопределяется метод Equals, необходи
мо перегрузить и метод GetHashCode. Подробнее о хеш-кодах рассказывается
в разделе «Абстрактные структуры данных» (см. с. 291). Синтаксис:
|
|
public virtual int GetHashCode();
□ Метод GetType возвращает текущий полиморфный тип объекта, то есть не тип
ссылки, а тип объекта, на который она в данный момент указывает. Возвра
щаемое значение имеет тип Туре. Это абстрактный базовый класс иерархии,
использующийся для получения информации о типах во время выполнения1.
Синтаксис:
public Type GetType();
□ Метод ReferenceEquals возвращает значение true, если оба параметра ссыла
ются на одну и ту же область памяти. Синтаксис:
public static bool(object ob1, object ob2);
□ Метод ToString по умолчанию возвращает для ссылочных типов полное имя
класса в виде строки, а для значимых — значение величины, преобразованное
в строку. Этот метод переопределяют для того, чтобы можно было выводить
информацию о состоянии объекта. Синтаксис:
public virtual string ToString()
В производных объектах эти методы часто переопределяют. Например, можно переопределить метод Equals для того, чтобы задать собственные критерии сравнения объектов, потому что часто бывает удобнее использовать для сравнения не ссылочную семантику (равенство ссылок), а значимую (равенство значений). Пример применения и переопределения методов класса object для класса Monster приведен в листинге 8.5.
1 Мы рассмотрим этот тип в главе 12 (см. с. 279).
Листинг 8.5. Перегрузка методов класса object
using System;
namespace ConsoleApplication1
{
class Monster
{
public Monster(int health, int ammo, string name)
{
this.health = health; this.ammo = ammo; this.name = name;
}
public override bool Equals(object obj)
{
if (obj == null || GetType()!= obj.GetType())
|
|
return false;
Monster temp = (Monster)obj;
return health == temp.health &&
ammo == temp.ammo &&
name == temp.name;
}
public override int GetHashCode()
{
return name.GetHashCode();
}
public override string ToString()
{
return string.Format("Monster {0} \t health = {1} ammo = {2}",
name, health, ammo);
}
string name; int health, ammo;
}
class Class1
{
static void Main()
{
Monster X = new Monster(80, 80, "Вася");
Monster Y = new Monster(80, 80, "Вася");
Monster Z = X;
if (X == Y) Console.WriteLine(" X == Y ");
else Console.WriteLine(" X!= Y ");
if (X == Z) Console.WriteLine("X == Z ");
else Console.WriteLine("X!= Z ");
if (X.Equals(Y)) Console.WriteLine(" X Equals Y ");
else Console.WriteLine(" X not Equals Y ");
Console.WriteLine(X.GetType());
}
}
}
Результат работы программы:
X!= Y
X == Z
X Equals Y
ConsoleApplication1. Monster
В методе Equals сначала проверяется переданный в него аргумент. Если он равен null или его тип не соответствует типу объекта, вызвавшего метод, возвращается значение false. Значение true формируется в случае попарного равенства всех полей объектов.
Метод GetHashCode просто делегирует свои функции соответствующему методу одного из полей. Метод ToString формирует форматированную строку, содержащую значения полей объекта.
Анализируя результат работы программы, можно увидеть, что в операции сравнения на равенство сравниваваются ссылки, а в перегруженном методе Equals -значения. Для концептуального единства можно переопределить и операции отношения, соответствующий пример приведен в разделе «Перегрузка операций отношения» (см. с. 203).