Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

ТАК делать не желательно, так как результат будет не всегда верен!!!

a2+=++a2+1; //!!!! Операция += не перегружена, вместо этого выполняется:

//a2=(++a2+1)+a2(уже измененное!!!)

a2.Print(“(++a2+1), +a2”);

}

catch (Exception e)

{Console.WriteLine(e.Message);}

}…

Перегрузку операций можно осуществить с помощью открытых методов класса 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. В основной программе использовать операции сравнения: «==», «!=» и т.д.

 

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

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

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

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

{

<== предыдущая лекция | следующая лекция ==>
Перегрузка бинарных операций | Первичная структура полипептидов и белков
Поделиться с друзьями:


Дата добавления: 2014-01-20; Просмотров: 386; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




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