IComparable et IComparable
-
22-10-2019 - |
Question
Devrais-je mettre en œuvre à la fois IComparable
et le IComparable<T>
générique? Y a-t-il des limites si je ne mettre en œuvre l'un d'entre eux?
La solution
Oui, vous devez mettre en œuvre à la fois.
Si vous implémentez un, tout code qui dépend de l'autre échouera.
Il y a beaucoup de code qui utilise soit IComparable
ou IComparable<T>
mais pas les deux, de sorte que la mise en œuvre à la fois assurer votre code fonctionnera avec ce code.
Autres conseils
Oded est juste que vous devez mettre en œuvre à la fois parce qu'il ya des collections et d'autres classes qui comptent sur une seule des implémentations.
Mais il y a un truc là-bas: IComparable
Cependant, IComparable générale accepte System.Object et vous ne pouvez pas garantir que tous les objets imaginables serait comparable contre les cas de T. Par conséquent, si vous obtenez une instance non-T est passé à IComparable, il suffit de jeter le System.ArgumentException. Dans le cas contraire, acheminer l'appel à la IComparable
Voici l'exemple:
public class Piano : IComparable<Piano>, IComparable
{
public int CompareTo(Piano other) { ... }
...
public int CompareTo(object obj)
{
if (obj != null && !(obj is Piano))
throw new ArgumentException("Object must be of type Piano.");
return CompareTo(obj as Piano);
}
}
Cet exemple fait partie d'un article beaucoup plus long qui contient une analyse approfondie des effets secondaires que vous devez prendre soin de la mise en œuvre IComparable
Alors que IEquatable
Supposons, par exemple, une a une SchedulerEvent de classe qui contient des champs ScheduledTime (de type DateTime) et ScheduledAction (de type MethodInvoker). La classe comprend les sous-types SchedulerEventWithMessage (ce qui ajoute un champ de message de type chaîne) et SchedulerEventWithGong (ce qui ajoute un champ GongVolume de type double). La classe SchedulerEvent a un ordre naturel, par ScheduledTime, mais il est tout à fait possible pour les événements qui ne sont pas ordonnés par rapport à l'autre pour être inégale. Les classes SchedulerEventWithMessage et SchedulerEventWithGong ont aussi ordonnancements naturels entre eux, mais pas par rapport aux éléments de SchedulerEvent de classe.
Supposons que l'on a deux événements SchedulerEventWithMessage X et Y prévus pour en même temps, mais X.Message est « Aardvark » et Y.Message est « zymurgy ». ((IComparable
Soit dit en passant, on peut dire que ce serait utile d'avoir la sémantique de IEquatable