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); |