#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; } }
Комментариев нет:
Отправить комментарий