Страницы

Поиск по вопросам

суббота, 8 февраля 2020 г.

Проблема с IComparable при наследовании: используется метод базового класса

#c_sharp


Есть класс

class A : IComparable 
{
private int value;
...
...
        public int CompareTo(A obj)
        {
            if (this.value > obj.value)
                return 1;
            if (this.value < obj.value)
                return -1;
            else
                return 0;
        }
}


Есть его потомок

class B : A
{
private int value2;
...
...
        public int CompareTo(B obj)
        {
            if (this.value2 > obj.value2)
                return 1;
            if (this.value2 < obj.value2)
                return -1;
            else
                return 0;
        }
}


Если я в функции Main имею 

List list = new List();


И вызываю метод 

list.Sort();


В дебаге вижу, что сравнение происходит методом CompareTo из класса А. Почему? Список
же состоит из элементов класса B. Как исправить?
Спасибо.
    


Ответы

Ответ 1



Дело в том, что у Вас только класс A наследует интерфейс IComparable. Именно поэтому, несмотря на то, что класс B является потомком класса A, при сравнении используется метод CompareTo из базового класса. Для решения этой проблемы необходимо чтобы класс B явно наследовал интерфейс IComparable. class B : A, IComparable

Ответ 2



Еще один вариант использовать виртуальную функцию class A : IComparable
{ private int value; ... protected virtual int Comparator(A obj){ if (this.value > obj.value) return 1; if (this.value < obj.value) return -1; else return 0; } public int CompareTo(A obj) { return Comparator(obj); } } class B : A { private int value2; ... protected override int Comparator(A objA){ { var obj = (B)objA; if(obj == null) return -1; if (this.value2 > obj.value2) return 1; if (this.value2 < obj.value2) return -1; else return 0; } }

Комментариев нет:

Отправить комментарий