Класс object

Корневой класс 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).


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: