Interface IComparable
A Interface
IComparable normalmente é confundida com a interface IComparer. Ambos são
utilizados para comparações entre objetos. O IComparable, ou comparável, possui
um método com a assinatura: int CompareTo(System.Object); . Repare que este
método retorna um int. Isto acontece por que outros métodos utilizam as
variações de retorno de coleções que implementam IComparable para fazer
ordenação. O algoritmo de ordenação utilizado pelo .NET e suas otimizações não
serão descritas neste artigo.
A Interface
IComparer, ou comparador, é utilizada de para comparar 2 objetos segundo a
assinatura: int Compare(System.Object x,
System.Object y);. Diferentemente do CompareTo(System.Object) do IComparable, o
Compare(System.Object x, System.Object y) do IComparer compara 2 objetos, e não
um objeto com o próprio.
Estas interfaces
devem ser utilizadas para tipos por referência que não devam possuir sobrecarga
do operador de comparação. Como o .NET não faz isso nativamente, recomenda-se
fazer sobrecarga do operador de comparação ‘==’ que faz chamada ao método
Compare(System.Object x, System.Object y), numa espécie de facade.
As interfaces
IComparable e IComparer trabalham com System.Object e não com tipos genéricos.
São heranças do .NET 1.0/1.1. Atualmente existem versões genéricas de ambas as
interfaces. O trabalho com System.Object pede boxing e unboxing, interno e
externo respectivamente. Se o tipo passado para os métodos das interfaces não
estiver coerente com a classe, uma exceção deve ser lançada. Recomenda-se o uso
da exceção ArgumentException para este tipo do problema.
O método int
CompareTo de IComparable é base para o método Sort() de ArrayList funcionar.
Este método deve retornar -1, 0 ou 1 seguindo um determinado critério definido
pelo programador. Através de seu algoritmo interno de ordenação o Sort() de
ArrayList faz o ordenamento.
Vamos considerar
uma classe que implemente ICompare chamada Pessoa. Esta classe possui string
nome e int idade. Vamos considerar que apenas o nome seja ordenável. Numa
situação destas é interessante o uso do método CompareTo() da string nome como
retorno do CompareTo() da classe Pessoa. Esta solução é válida para qualquer
tipo primitivo ou mesmo por referencia que implemente ICompare e que seja ordenável
em alguma classe.
public int
CompareTo(object obj)
{
pessoateste p = (pessoateste)obj;
return this.nome.CompareTo(p.nome);
}
Nenhum comentário:
Postar um comentário