Здравствуйте. У меня появился такой вопрос: зачем в C# метод CompareTo интерфейса IComparable принимает параметр типа object? Не проще ли принимать параметр того же типа IComparable? Заранее спасибо
Ответ
В .NET на самом деле есть оба интерфейса: IComparable и IComparable. Первый сохраняется как наследие со времён .NET 1.x, в котором не было обобщённых типов (генериков).
Для старого IComparable каким может быть тип аргумента функции CompareTo? Это должен быть один тип на все возможные случаи использования, для сравнения любого типа с собой, так что единственное, что может в принципе подойти, это object
Для нового IComparable мы можем объявить возможность сравнения с любым типом Т, которым захотим. Разумеется, никто не помешает написать
class A : IComparable { ...
— но правильное использование интерфейса, конечно, для сравнения с объектами того же самого типа:
class A : IComparable<А> { ...
К сожалению, система типов .NET на текущий момент недостаточно сильна, чтобы выразить ограничение «тип, сравнимый с самим собой», а не просто «тип, сравнимый с данным типом». Если вам интересны языки с более развитой системой типов, гляньте в сторону функциональных языков.
Комментариев нет:
Отправить комментарий