Упорядоченность объектов и интерфейс IComparable — КиберПедия 

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Упорядоченность объектов и интерфейс IComparable

2017-10-11 243
Упорядоченность объектов и интерфейс IComparable 0.00 из 5.00 0 оценок
Заказать работу

Часто, когда создается класс, желательно задать отношение порядка на его объектах. Такой класс следует объявить наследником интерфейса IComparable. Этот интерфейс имеет всего один метод CompareTo (object obj), возвращающий целочисленное значение, положительное, отрицательное или равное нулю, в зависимости от выполнения отношения "больше", "меньше" или "равно".

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

Давайте введем отношение порядка на классе Person, рассмотренном в лекции 16, сделав этот класс наследником интерфейса IComparable. Реализуем в этом классе метод интерфейса CompareTo:

public class Person:IComparable{ public int CompareTo(object pers) { const string s = "Сравниваемый объект не принадлежит классу Person"; Person p = pers as Person; if (!p.Equals(null)) return (fam.CompareTo(p.fam)); throw new ArgumentException (s); } // другие компоненты класса}

Поскольку аргумент метода должен иметь универсальный тип object, то перед выполнением сравнения его нужно привести к типу Person. Это приведение использует операцию as, позволяющую проверить корректность выполнения приведения.

При приведении типов часто используются операции is и as. Логическое выражение (obj is T) истинно, если объект obj имеет тип T. Оператор присваивания (obj = P as T;) присваивает объекту obj объект P, приведенный к типу T, если такое приведение возможно, иначе объекту присваивается значение null. Семантику as можно выразить следующим условным выражением: (P is T)? (T)P: (T)null.

Заметьте также, что при проверке на значение null используется отношение Equals, а не обычное равенство, которое будет переопределено.

Отношение порядка на объектах класса Person задается как отношение порядка на фамилиях персон. Так как строки наследуют интерфейс IComparable, то для фамилий персон вызывается метод CompareTo, его результат и возвращается в качестве результата метода CompareTo для персон. Если аргумент метода не будет соответствовать нужному типу, то выбрасывается исключение со специальным уведомлением.

Конечно, сравнение персон может выполняться по разным критериям: возрасту, росту, зарплате. Общий подход к сравнению персон будет рассмотрен в следующей лекции 20.

Введем теперь в нашем классе Person перегрузку операций отношения:

public static bool operator <(Person p1, Person p2){ return (p1.CompareTo(p2) < 0);}public static bool operator >(Person p1, Person p2){ return (p1.CompareTo(p2) > 0);}public static bool operator <=(Person p1, Person p2){ return (p1.CompareTo(p2) <= 0);}public static bool operator >=(Person p1, Person p2){ return (p1.CompareTo(p2) >=0);}public static bool operator ==(Person p1, Person p2){ return (p1.CompareTo(p2) == 0);}public static bool operator!=(Person p1, Person p2){ return (p1.CompareTo(p2)!= 0);}

Как обычно, приведу тестовый пример, проверяющий работу с введенными методами:

public void TestCompare(){ Person poet1 = new Person("Пушкин"); Person poet2 = new Person("Лермонтов"); Person poet3 = new Person("Пастернак"); Person poet4 = new Person("Мандельштам"); Person poet5 = new Person("Ахматова"); Person poet6 = new Person("Цветаева"); Console.WriteLine("{0} > {1} = {2}", poet1.Fam, poet2.Fam, (poet1 > poet2)); Console.WriteLine("{0} >= {1} = {2}", poet3.Fam, poet4.Fam, (poet3 >= poet4)); Console.WriteLine("{0}!= {1} = {2}", poet5.Fam, poet6.Fam, (poet5!= poet6));}

Вот результаты работы этого теста.


Рис. 19.4. Сравнение персон

Конечно, заданный нами порядок не имеет никакого отношения к поэтическому дару, а лишь говорит об относительном расположении фамилий поэтов в словарях.

19. Лекция: Интерфейсы. Множественное наследование

19.5


Поделиться с друзьями:

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.029 с.