C# - Usando Interfaces - I (IComparable)


Hoje vamos rever o conceito de Interfaces e mostrar como usar algumas interfaces importantes na linguagem c#.

Vamos começar definindo o que é uma interface na linguagem C# .

"Uma interface contém definições para um grupo de funcionalidades relacionadas que uma classe ou um struct pode implementar."

Assim, uma interface não contém uma implementação, contém apenas definições de métodos, propriedades, eventos e indexadores que expõe funcionalidades que uma classe ou struct que quiser usar terá que implementar.

Usando interfaces, você pode incluir o comportamento de várias fontes em uma classe, visto que a linguagem C# não dá suporte herança múltipla, você pode implementar mais de uma interface e incluir comportamento de mais de uma fonte na sua classe.

Não esqueça de respeitar o princípio ISP - Interface Segregation Principle ou o princípio da segregação da interface.

"Muitas interfaces específicas são melhores do que uma interface geral."

Além disso, você pode usar interfaces para simular a herança usando structs, pois eles não podem herdar de outro struct ou classe.

A linguagem C# possui centenas de interfaces prontas que podemos usar em nosso dia a dia. Abaixo segue alguma das mais usadas:

Vou mostrar a seguir como podemos usar algumas dessas interfaces começando com a interface IComparable.

Recursos usados:

Usando a interface IComparable

A interface IComparable define um método genérico de comparação específica de tipo que um tipo de valor ou classe implementa para ordenar ou classificar suas instâncias.

Essa interface é implementada por tipos cujos valores podem ser ordenados ou classificados. Ela requer que os tipos de implementação definam um único método, CompareTo(Object) , que indica se a posição     da instância atual na ordem de classificação é antes, depois, ou o mesmo que um segundo objeto do mesmo tipo.

Essa interface contém um único método que você pode usar para classificar os elementos.

int CompareTo (objeto obj);

O método CompareTo retorna um valor int que mostra como dois elementos estão relacionados um ao outro. Os valores possíveis são :

Voce implementa essa interface para customizar a ordenação de objetos. Ao implementar essa interface você é obrigado a adicionar o método público CompareTo(T).

Vamos agora para a parte prática...

Suponha que você tem uma classe chamada Funcionario que possui duas propriedades : Nome e Salario (para ficar bem simples).

Vamos usar a interface IComparable para incluir a funcionalidade de ordenação em nossa classe. Assim a classe Funcionario vai implementar a interface IComparable e teremos que implementar o método ComparteTo.

Ao fazer isso poderemos comparar um instância de Funcionario com outras instâncias da mesma classe.

Criando o projeto Console

Abra o VS 2017 Community e crie um novo projeto do tipo Console Application com o nome UsandoIComparable.

A seguir inclua uma classe chamada Funcionario no projeto com seguinte código :

using System;
namespace UsandoIComparable
{
    public class Funcionario : IComparable<Funcionario>
    {
        public string Nome { get; set; }
        public int Salario { get; set; }
        public int CompareTo(Funcionario funci)
        {
            // Se o salario for igual então faz a ordenação alfabética.[A a Z]
            if (this.Salario == funci.Salario)
            {
                return this.Nome.CompareTo(funci.Nome);
            }
            // Ordenação padrão : do maior salario para o menor
            return funci.Salario.CompareTo(this.Salario);
        }
        public override string ToString()
        {
            // Representação string do objeto
            return this.Salario.ToString() + "," + this.Nome;
        }
    }
}

A classe Funcionario implementa a interface IComparable e define o método CompareTo(Funcionario funci) onde faz o seguinte:

  1. Define uma ordenação padrão do maior para o menor salário entre duas instâncias da classe
  2. Se os salários forem iguais então a ordenação é feita pelo nome do funcionário

Definimos na classe o método ToString() para representar o objeto no formato string.

Agora vamos usar essa implementação incluindo o código abaixo no método Main() da classe Program :

using System;
using System.Collections.Generic;
namespace UsandoIComparable
{
    class Program
    {
        static void Main(string[] args)
        {
            //cria uma lista de funcionários
            List<Funcionario> lista = new List<Funcionario>();
            lista.Add(new Funcionario() { Nome = "Macoratti", Salario = 10000 });
            lista.Add(new Funcionario() { Nome = "Janice", Salario = 10000 });
            lista.Add(new Funcionario() { Nome = "Yuri", Salario = 40000 });
            lista.Add(new Funcionario() { Nome = "Bianca", Salario = 10000 });
            lista.Add(new Funcionario() { Nome = "Amanda", Salario = 500000 });
            lista.Add(new Funcionario() { Nome = "Jefferson", Salario = 17000 });
            lista.Add(new Funcionario() { Nome = "Dinora", Salario = 8000 });
            // Utiliza o método da interface :  IComparable.CompareTo()
            lista.Sort();
            // Utiliza o método ToString: Funcionario.ToString
            foreach (var funcionario in lista)
            {
                Console.WriteLine(funcionario);
            }
            Console.ReadLine();
        }
    }
}

Neste código criamos uma instância da classe Funcionario e definimos 7 objetos do tipo Funcionario.

A seguir utilizamos o método Sort() que vai chamar o método CompareTo() para fazer a ordenação.

Executando o projeto iremos obter o seguinte resultado:

Observe que a ordenação é feita pelo salário do maior para o menor mas quando os salários são iguais ocorre a ordenação pelo nome do funcionário.

Como você faria para inverter a ordem da ordenação, ou seja, do menor salário para o maior salário ???

Elementar meu caro Watson...

Basta inverter a ordem da expressão CompareTo() na classe Funcionario :

Altere o código de : return funci.Salario.CompareTo(this.Salario);

Para :                      return this.Salario.CompareTo(funci.Salario);

Executando novamente agora teremos o seguinte resultado:

Na segunda parte do artigo vamos tratar com a interface IDisposable.

Pegue o código do exemplo aqui :  UsandoIComparable.zip

"Vede quão grande amor nos tem concedido o Pai, que fôssemos chamados filhos de Deus. Por isso o mundo não nos conhece; porque não o conhece a ele."
1 João 3:1

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti