2013-10-06 4 views
2

Пусть у меня есть следующий класс:Как реализовать Multi-типа IComparable/IEquatable в C#

public sealed class ScaleValue : 
    IComparable, IComparable<ScaleValue>, IEquatable<ScaleValue> 
{ 
    public double Value 
    { get; set;} 
    public string Definition 
    { get; set;} 

    // interface methods 
    ... 
} 

Если я хочу, чтобы мой класс сопоставим с double я должен просто включить IComparable<double> и реализовать его таким образом или мне нужно сделать это по-другому?

И когда я хочу, чтобы мой класс был сопоставим с парными, double.CompareTo дает тот же результат, что и ScaleValue.CompareTo?

и как насчет Equals?

Я думаю, что я ввел свои обязанности в мой дизайн. Я думаю, что мой лучший вариант - сделать класс Scale с помощью метода ContainsValue(double Value). Таким образом, я могу найти ценность и сохранить обязанности там, где они нужны.

+0

Проблема в том, что сопоставимая проверка больше не будет симметричной. someScaleValue.CompareTo (1.2) вернет значение, но '1.2.CompareTo (someScaleValue)' будет генерировать исключение, потому что версия сравнения «double» не будет знать, как обращаться с вашим типом. Это проблема. – Servy

+1

У вас уже есть двойник, просто сравните это (помните принцип KISS) – Alex

+0

Почему вы хотите, чтобы ваш класс был сопоставим с парными? Вы пытаетесь сделать статический метод? У вас уже есть IComparable . В методе Comparer вы можете сравнить член ScaleValue.Value. –

ответ

0

Что может сравниться с вашим классом, зависит от вас. Вы можете сделать его сопоставимым с чем-нибудь, так как не-общая версия IComparable interface занимает object; при реализации CompareTo method вы можете в основном обнюхать тип объекта (если он не null).

Когда вы используете общую версию IComparable<T>, вы делаете утверждение, что вы реализуете строго типизированный метод сравнения независимо от параметра типа T.

Вообще, если у вас есть IComparable<T> реализацию одного типа, вы, вероятно, должны иметь IEquatable<T> реализацию, а также.

Наличие реализации IComparable/IComparable<T> означает, что то, что представлено структурой, имеет естественный порядок. При заказе также подразумевается равенство между двумя экземплярами: если экземпляр a от T не больше или меньше экземпляра b от T, то он должен быть равен.

С этой целью, если вы реализуете IComparable/IComparable<T>, тогда логика диктует, что вы реализуете IEquatable/IEquatable<T>.

Конечно, когда вы применяете IEquatable/IEquatable<T>, вы должны переопределить Equals и GetHashCode.

Что в свою очередь означает, что вы должны переопределить все операторы сравнения:

  • == (что подразумевает !=)
  • < и <=
  • > и >=
+0

то, что вы сказали мне, я уже понял. что я хочу сказать, что у меня есть набор ScaleValue 'Scale'. теперь я хочу проверить, есть ли в списке какое-то значение '' 'типа' double'. 'Scale.contains (а)'. поэтому я спросил, должен ли я реализовывать 'Icomparable '. в классе ScaleValue определение свойства менее важно. – user2038134

+0

@ user2038134 Это не имеет смысла. Что делать, если у вас есть два свойства, которые выставляют 'double'? Одна реализация 'IComparable ' не даст вам то, что вы ищете. Вам нужно использовать что-то вроде метода расширения «Where» в LINQ, чтобы делать то, что вы хотите. – casperOne

0

Вы не можете сравнить объекты в коллекции к объекту различного типа, содержащего metho d, если вы не реализуете целый новый тип коллекции для своего класса или не используете какой-либо метод расширения !!!

 Смежные вопросы

  • Нет связанных вопросов^_^