Реализация IComparable <NotSelf>

Это могло бы быть тривиальным вопросом, но я не нашел информации об этом: это - "вредная" или рассмотренная плохая практика для создания реализации типа T IComparable<S> (T и S быть двумя различными типами)?

Пример:

class Foo : IComparable<int>
{
    public int CompareTo(int other)
    {
        if (other < i) return -1;
        if (other > i) return 1;

        return 0;
    }

    private int i;
}

Этого вида кода нужно избежать, и если да, почему?

6
задан Luc Touraille 29 March 2010 в 16:18
поделиться

2 ответа

Я бы, по крайней мере, счел это "странным" - в частности, в этот момент сравнение не будет симметричным, что обычно является частью обычных контрактов сравнения.

Если есть конкретная ситуация, когда это проще, чем любая другая реализация того, что вы хотите сделать, это было бы нормально - но я не могу сказать, что когда-либо сталкивался с такой ситуацией. Сравнения, подобные этому, почти всегда используются для сортировки однородной коллекции или чего-то подобного.

Вы имели в виду конкретную ситуацию, или это просто вопрос "для интереса"?

.
6
ответ дан 10 December 2019 в 02:45
поделиться

Реализовывать такие вещи модно. Но это не очень хорошая практика.

Представьте, что вы видите такой код:

Foo x = new Foo();

if( x.compareTo(15) > 0)
{
  //blah blah
}

Вы скажете: "О боже! Как сравнить 15 с x?"? Это сделает код менее читабельным.

Лучше добавить сравнение как функцию, как это сделано здесь: public int IsMoreThanPrivateI(int x);

2
ответ дан 10 December 2019 в 02:45
поделиться
Другие вопросы по тегам:

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