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

Две главных причины приходят на ум:

  1. Статические методы в Java не могут быть переопределены подклассами, и это - намного большее соглашение для методов, чем статические поля. На практике я даже не хотел переопределить поле в подклассе, но мне переопределенные методы все время. Так наличие статических методов предотвращает класс, реализовывая интерфейс от предоставления его собственной реализации того метода, который в основном побеждает цель использовать интерфейс.

  2. Интерфейсы, как предполагается, не имеют код; это - то, для чего абстрактные классы. Смысл интерфейса должен позволить Вам говорить о возможно-несвязанных-объектах, которые происходят со всеми, имеют определенный набор методов. На самом деле обеспечение реализации тех методов вне границ того, чем интерфейсы предназначаются, чтобы быть.

6
задан fbrereto 12 December 2009 в 05:28
поделиться

3 ответа

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);
13
ответ дан 8 December 2019 в 12:20
поделиться

Реализация не эквивалентна, если operator <представляет собой слабый порядок. Например, представьте, что объекты T1 являются узлами в орграфе, а T1a означает «T1a является предком T1b в графе» (это не такая уж необычная запись).

Тогда: ! (T1b будет означать, что «t1b не является предком t1a», так что либо:

  1. t1a является предком t1b (исключено первым тестом)
  2. t1a то же самое узел как t1b
  3. t1a и t1b не сопоставимы (т. е. они братья и сестры)

Этот третий случай действительно важен. В этом случае вы, вероятно, хотите, чтобы operator <возвращал false для пары, но это может не быть.

(Слабый порядок в наборе элементов означает, что a <= b и b <= a могут быть ложными.)

Лично я не люблю перегрузку операторов, особенно при использовании с универсальными шаблонами. Программисты склонны предполагать хорошие «арифметические» свойства, которые не всегда выполняются.

4
ответ дан 8 December 2019 в 12:20
поделиться

Я бы использовал второе, потому что это то, что определяет Стандарт!

Эти два определения, как уже упоминалось другими, эквивалентны, если < определяет общее упорядочение обоих типов и == соответствует <. Но когда одно из них неверно, разница заметна, и если вы использовали первое определение, вы не соответствовали бы.

РЕДАКТИРОВАТЬ: Стандартное определение лучше вашего первого определения в одном смысле: 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)

, поэтому алгоритм обнаруживает, что массив не отсортирован должным образом.

(Этот ответ ранее был полностью неверен анализ данной ситуации - извините! )

2
ответ дан 8 December 2019 в 12:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: