Чтение онлайн

на главную - закладки

Жанры

C# 4.0 полное руководство - 2011

Шилдт Герберт

Шрифт:

Для сравнения двух объектов параметра обобщенного типа они должны реализовывать интерфейс IComparable или IComparable<T> и/или интерфейс IEquatable<T>. В обоих вариантах интерфейса IComparable для этой цели определен метод СошрагеТо , а в интерфейсе IEquatable<T> — метод Equals (). Разновидности интерфейса IComparable предназначены для применения в тех случаях,

когда требуется определить относительный порядок следования двух объектов. А интерфейс
IE qua table служит для определения равенства двух объектов. Все эти интерфейсы определены в пространстве имен System и реализованы во встроенных в C# типах данных, включая int, string и double. Но их нетрудно реализовать и для собственных создаваемых классов. Итак, начнем с обобщенного интерфейса IEquatable<T>. Интерфейс IEquatable<T> объявляется следующим образом.

public interface IEquatable<T>

Сравниваемый тип данных передается ему в качестве аргумента типа Т. В этом интерфейсе определяется метод Equals , как показано ниже.

bool Equals(Т other)

В этом методе сравниваются вызывающий объект и другой объект, определяемый параметром other. В итоге возвращается логическое значение true, если оба объекта равны, а иначе — логическое значение false.

В ходе реализации интерфейса IEquatable<T> обычно требуется также переопределять методы GetHashCode и Equals (Object), определенные в классе Object, чтобы они оказались совместимыми с конкретной реализацией метода Equals . Ниже приведен пример программы, в которой демонстрируется исправленный вариант упоминавшегося ранее метода Is In .

// Требуется обобщенный интерфейс IEquatable<T>.

public static bool IsIn<T>(T what, T[] obs) where T : IEquatable<T> { foreach(T v in obs)

if(v.Equals(what)) // Применяется метод Equals. return true;

return false;

}

Обратите внимание в приведенном выше примере на применение следующега ограничения.

where Т : IEquatable<T>

Это ограничение гарантирует, что только те типы, в которых реализован интерфейс IEquatable, являются действительными аргументами типа для метода Is In . Внутри этого метода применяется метод Equals , который определяет равенство одного объекта другому.

Для определения относительного порядка следования двух элементов применяется интерфейс I Comp а г able. У этого интерфейса имеются две формы: обобщенная и необобщенная. Обобщенная форма данного интерфейса обладает преимуществом

обеспечения типовой безопасности, и поэтому мы рассмотрим здесь именно ее. Обобщенный интерфейс
IComparable<T> объявляется следующим образом.

public interface IComparable<T>

Сравниваемый тип данных передается ему в качестве аргумента типа Т. В этом интерфейсе определяется метод CompareTo , как показано ниже.

int CompareTo(Т other)

В этом методе сравниваются вызывающий объект и другой объект, определяемый параметром other. В итоге возвращается нуль, если вызывающий объект оказывается больше, чем объект other; и отрицательное значение, если вызывающий объект оказывается меньше, чем объект other.

Для того чтобы воспользоваться методом CompareTo , необходимо указать ограничение, которое требуется наложить на аргумент типа для реализации обобщенного интерфейса IComparable<T>. А затем достаточно вызвать метод CompareTo , чтобы сравнить два экземпляра параметра типа.

Ниже приведен пример применения обобщенного интерфейса IComparable<T>. В этом примере вызывается метод InRange , возвращающий логическое значение true, если объект оказывается среди элементов отсортированного массива.

// Требуется обобщенный интерфейс IComparable<T>. В данном методе // предполагается, что массив отсортирован. Он возвращает логическое // значение true, если значение параметра what оказывается среди элементов // массива, передаваемых параметру obs.

public static bool InRange<T>(T what, T[] obs) where T : IComparable<T> { if(what.CompareTo(obs[0]) < 0 ||

what.CompareTo(obs[obs.Length-1]) > 0) return false; return true;

}

В приведенном ниже примере программы демонстрируется применение обоих методов Is In и InRange на практике.

// Продемонстрировать применение обобщенных // интерфейсов IComparable<T> и IEquatable<T>.

using System;

// Теперь в классе MyClass реализуются обобщенные // интерфейсы IComparable<T> и IEquatable<T>. class MyClass : IComparable<MyClass>, IEquatable<MyClass> { public int Val;

public MyClass(int x) { Val = x; }

// Реализовать обобщенный интерфейс IComparable<T>. public int CompareTo(MyClass other) {

return Val - other.Val; // Now, no cast is needed.

> \

// Реализовать обобщенный интерфейс IEquatable<T>.

public bool Equals(MyClass other) { return Val == other.Val;

}

// Переопределить метод Equals(Object).

Поделиться:
Популярные книги

Мастеровой

Дроздов Анатолий Федорович
Фантастика:
фэнтези
боевая фантастика
альтернативная история
7.40
рейтинг книги
Мастеровой

Новый Рал 9

Северный Лис
9. Рал!
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Новый Рал 9

Черный дембель. Часть 3

Федин Андрей Анатольевич
3. Черный дембель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черный дембель. Часть 3

Семья. Измена. Развод

Высоцкая Мария Николаевна
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Семья. Измена. Развод

Матабар. II

Клеванский Кирилл Сергеевич
2. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар. II

Рейдер 2. Бродяга

Поселягин Владимир Геннадьевич
2. Рейдер
Фантастика:
фэнтези
попаданцы
7.24
рейтинг книги
Рейдер 2. Бродяга

На границе империй. Том 8

INDIGO
12. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 8

Возвышение Меркурия

Кронос Александр
1. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия

Гримуар темного лорда IX

Грехов Тимофей
9. Гримуар темного лорда
Фантастика:
попаданцы
альтернативная история
аниме
фэнтези
5.00
рейтинг книги
Гримуар темного лорда IX

Купец IV ранга

Вяч Павел
4. Купец
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Купец IV ранга

Зубных дел мастер

Дроздов Анатолий Федорович
1. Зубных дел мастер
Фантастика:
научная фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Зубных дел мастер

Я еще не князь. Книга XIV

Дрейк Сириус
14. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я еще не князь. Книга XIV

Неофит

Вайт Константин
1. Аннулет
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Неофит

Измена. (Не)любимая жена олигарха

Лаванда Марго
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. (Не)любимая жена олигарха