HAVIT Knowledge Base

Vývoj webových aplikací, .NET, SQL, návrh
Welcome to HAVIT Knowledge Base Sign in | Join | Help
-
Home Články Forums Obrázky Soubory

Patterns & practices

Architecture patterns, design patterns, best practices, implementace interfaces, ...

IComparable

Rozhraní IComparable, popř. strong-typed IComparable<T> slouží jako podpora pro porovnávání prvků, zejména pro jejich řazení (metody Sort). K implementaci je jediná instanční metoda CompareTo(), jejíž výsledek má být:

  • nula, pokud jsou instance stejné (z hlediska porovnání rovnocenné),
  • záporný, pokud je je instance (this) menší než parametr metody (při vzestupném řazení bude this dříve než parametr),
  • kladný, pokud je instance (this) větší než parametr metody (při vzestupném řazení bude parametr dříve než this).

Tato konvence vyplynula z metodiky používané pro porovnávání čísel prostým odečtením this-param.

Dále musíme dodržet následující definiční pravidla, na která se často zapomíná:

  • null < cokoliv jiného,
  • null = null (neimplementuje se)

Samozřejmě taky všechna klasická pravidla:

  • když A = B a B = C, tak A = C,
  • když A < B a B < C, tak A < C,
  • když A < B, tak B > A,
  • ...

Vzorová implementace obou rozhraní by pak mohla vypadat takto:

public class MyComparableClass : IComparable, IComparable<MyComparableClass>
{
   // Strong-typed implementace IComparable<T>
   public int CompareTo(MyComparableClass other)
   {
      if (other == null)
      {
         return 1;
      }
      // naše implementace srovnání, například
      return this.Value.CompareTo(other.Value);
   }
   // Implementace IComparable
   public int CompareTo(object obj)
   {
      if (obj == null)
      {
         return 1;
      }
      if (obj is MyComparableClass)
      {
         return CompareTo(obj as MyComparableClass);
      }
      throw new ArgumentException("obj musí být typu MyComparableClass", "obj");
   }
}

Doporučuje se, aby třída, která implementuje IComparable, overridovala i metodu Equals.

Published 28. dubna 2006 17:59 by Robert Haken
Filed under:

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Comments

No Comments

What do you think?

(required) 
(optional)
(required) 
Enter the code you see below

Submit