русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Class Monster : IComparable


Дата добавления: 2013-12-23; просмотров: 782; Нарушение авторских прав


Пример перегрузки операций сравнения с использованием стандартных методов класса Object

Чаще всего в классах при перегрузке операции сравнения обеспечивают сравнения значений экземпляров класса, а не их ссылок.

Класс System.Object

Перегрузку операций можно осуществить с помощью открытых методов класса System.Object

Класс Object является корневым классом всей библиотеки объектов .NET и обеспечивает всех своих наследников всеми методами, которые они могут либо использовать без изменений, либо переопределять. Ниже перечислены открытые методы класса Object, которые программисты используют в своих классах:

o public virtual bool Equals (object obj); -метод возвращает True или False в зависимости от того, ссылается ли параметр objи вызывающий экземпляр класса на одну и ту же область памяти. Этот же метод можно использовать с двумя параметрами.

o public virtual int GetHashCode (); - формирует хэш-код объекта и возвращает число, однозначно идентифицирующее объект. Это число может использоваться в различных структурах данных и алгоритмах библиотеки.

Обычно метод GetHashCode() перегружается, если используется перегрузка метода Equals().

o public Type GetType(); - возвращает текущий тип объекта, а не тип ссылки. Тип Type – это абстрактный базовый класс, который получает информацию (тип данных) об экземпляре класса не, как о ссылке, а как о простой переменной класса.

Для того, что бы в основной программе перегрузить операции сравнения с использованием методов класса object необходимо:

1. Перегрузить метод Equals()

2. В данном методе использовать метод GetType()

3. Перегрузить метод GetHashCode()

4. В основной программе использовать операции сравнения: «==», «!=» и т.д.

 

Обычно операции сравнения перегружаются только парами.



namespace ConsoleApplication1

{

class Monster

{

public Monster(int сила, int умение, string имя)

{

this.сила = сила;

this.умение = умение;

this.имя = имя;

}

/* В данном методе сначала сравнивается экземпляр класса с "пустой" областью памяти и сравниваются два экземпляра класса на соотвествие типов и если одно из этих условий не выполняется возврщается False. Если же два экземпляра одного и того же класса «равны», то возвращается значение True, только в том случае, если все поля обоих классов совпадают.*/

public override bool Equals(object obj)

{

if (obj == null || GetType() != obj.GetType()) return false;

Monster temp = (Monster)obj;

return (сила == temp.сила && умение == temp.умение && имя == temp.имя);

}

public override int GetHashCode()// Данный метод возвращает целое число, которое однозначно иденцифицирует экземпляр класса по имени.

{

return имя.GetHashCode();

}

public override string ToString()

{

return string.Format("Монстр {0} Сила {1} Умение {2}", имя, сила, умение);

}

string имя; //данные класса

int сила;

int умение;

} class Program

{

static void Main(string[] args)

{

Monster X = new Monster(100, 100, "Дима");

Monster Y = new Monster(100, 100, "Дима");

Monster Z = X; //Использование операции “присвоить”

if (X == Y) Console.WriteLine("Монстры равны!");

else Console.WriteLine("Монстры не равны"); // использование перегруженной операции сравнения на равенство

// В данном случаи монстр X и монстр Y не равны так как занимают в памяти разные адреса.Монстры X и Z будут равны.

if (X.Equals(Y)) Console.WriteLine("X эквивалентно Y"); //Монстры эквиваленты, так как имеют одинаковые значения полей

else Console.WriteLine("X не эквивалентно Y");

Console.WriteLine(X.GetType()); // Возвращается тип для экземпляра класса X. Возвратиться тип переменной X - ConsoleApplecation.Monster.

Console.ReadKey();

}

}

}

 

 


Перегрузку операций можно осуществить также с помощью стандартного интерфейса IComparable.

Если класс реализует интерфейс IComparable, его экземпляры можно сравнивать между собой по принципу больше или меньше. Можно использовать для этого операции отношения, перегрузив их. Операции должны перегружаться парами. Перегрузка операций обычно выполняется путем делегирования, то есть обращения к переопределенным методам CompareTo() и Equals().

Если класс реализует интерфейс IComparable, требуется переопределить метод Equals() и связанный с ним метод GetHashCode(). Оба метода унаследованы от базового класса object.

Рассмотрим предыдущий пример перегрузки операций отношений для класса Monster с использованием стандартного интерфейса IComparable.

В качестве критерия сравнения объектов по принципу больше или меньше выступает поле int сила, а при сравнении на равенство реализуется значимая семантика (то есть попарно сравниваются все поля объектов).

namespace ConsoleApplication1

{

{

public Monster(int сила, int умение, string имя)

{

this.сила = сила;

this.умение = умение;

this.имя = имя;

}

public void Passport()

{

Console.WriteLine("Монстр{0} \t сила ={1} умение={2}", имя, сила, умение);

}

 

public override bool Equals(object obj)

{

if (obj == null || GetType() != obj.GetType()) return false;

Monster temp = (Monster)obj;

return (сила == temp.сила && умение == temp.умение && имя == temp.имя);

}

public override int GetHashCode()

{

return имя.GetHashCode();

}



<== предыдущая лекция | следующая лекция ==>
ТАК делать не желательно, так как результат будет не всегда верен!!! | УЧЕТ ОСНОВНЫХ СРЕДСТВ


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.004 сек.