Две главных причины приходят на ум:
Статические методы в Java не могут быть переопределены подклассами, и это - намного большее соглашение для методов, чем статические поля. На практике я даже не хотел переопределить поле в подклассе, но мне переопределенные методы все время. Так наличие статических методов предотвращает класс, реализовывая интерфейс от предоставления его собственной реализации того метода, который в основном побеждает цель использовать интерфейс.
Интерфейсы, как предполагается, не имеют код; это - то, для чего абстрактные классы. Смысл интерфейса должен позволить Вам говорить о возможно-несвязанных-объектах, которые происходят со всеми, имеют определенный набор методов. На самом деле обеспечение реализации тех методов вне границ того, чем интерфейсы предназначаются, чтобы быть.
It is not legitimate to assume that for any type, if it is less-than comparable, it is also equality comparable, since one can overload operator<
but not overload operator==
.
Thus, if you anticipate having to handle user-defined types, the second approach is preferable. However, you should add some parentheses to clarify the order of operations:
return x.first < y.first ||
(!(y.first < x.first) && x.second < y.second);
Реализация не эквивалентна, если operator <представляет собой слабый порядок. Например, представьте, что объекты T1 являются узлами в орграфе, а T1a
Тогда: ! (T1b
Этот третий случай действительно важен. В этом случае вы, вероятно, хотите, чтобы operator <возвращал false для пары, но это может не быть.
(Слабый порядок в наборе элементов означает, что a <= b
и b <= a
могут быть ложными.)
Лично я не люблю перегрузку операторов, особенно при использовании с универсальными шаблонами. Программисты склонны предполагать хорошие «арифметические» свойства, которые не всегда выполняются.
Я бы использовал второе, потому что это то, что определяет Стандарт!
Эти два определения, как уже упоминалось другими, эквивалентны, если <
определяет общее упорядочение обоих типов и ==
соответствует <
. Но когда одно из них неверно, разница заметна, и если вы использовали первое определение, вы не соответствовали бы.
РЕДАКТИРОВАТЬ: Стандартное определение лучше вашего первого определения в одном смысле: if , поэтому алгоритм обнаруживает, что массив не отсортирован должным образом. (Этот ответ ранее был полностью неверен анализ данной ситуации - извините! ) <
определяет строгий слабый порядок как на T1, так и на T2, тогда стандартное определение дает строгий слабый порядок на паре
. Ваше первое определение - нет, и это может вызвать реальные проблемы. Например, предположим, что у нас есть такие x и y, что ни x < y
и y
a [3] = {P (x, 2), P (y, 1), P (x, 1)}
. Очевидно, мы должны сказать, что этот массив не отсортирован в порядке возрастания, потому что a [2] . Но если мы воспользуемся вашим первым определением,
std :: is_sorted
сделает вывод, что массив отсортирован , потому что никакие два последовательных элемента не могут быть сопоставимы. Тот факт, что первое определение не является строгим слабым порядком, нарушает алгоритм. В соответствии со Стандартным определением P (y, 1)