You are on page 1of 5

Introduo

veremos como funcionam as interfaces que permitem uma implementao mais avanada de polimorfismo.

Definindo uma interface no C#


O conceito de interfaces um conceito avanado de implementao de sistemas orientados objetos. Apesar de aparentemente parecer complicado, o conceito de interface extremamente simples e permite a construo de sistemas altamente flexveis. A interface funciona como uma espcie de protocolo utilizado para comunicao entre objetos. Para tentarmos ilustrar o funcionamento de interfaces, vamos utilizar o exemplo a seguir.

No exemplo acima temos uma classe chamada Impressora que faz interface com uma impressora capaz de imprimir documentos de qualquer espcie. Seu sistema trabalhar com uma srie de documentos. A classe Impressora tem um mtodo chamado imprimir, que deve receber como parmetro um documento para ser impresso. A grande dvida : que tipo devemos utilizar para este parmetro? Caso quisssemos imprimir recibos, poderamos fazer com que a classe impressora recebesse uma instancia da classe pai Recibo. O problema que isto no permitiria a impresso de documentos da classe ExtratoBancario ou mesmo da classe FichaCadastral. As interfaces servem para resolver justamente situaes como esta. As interfaces funcionam como uma espcie de protocolo, que permite objetos distintos (e que muitas vezes herdam de classes diferentes) possa ser utilizada como parmetro ou mesmo como tipo de retorno para outros objetos No exemplo acima, poderamos implementar uma interface com o nome IPrintable, que obrigaria cada uma das classes que implementa tal interface a disponibilizao de um mtodo ObterDocumento, para obter as informaes do documento. Desta forma, a classe impressora poderia receber qualquer objeto como parmetro para o mtodo imprimir, desde que este parmetro implementasse a interface IPrintable.

Implementanto interfaces no C#
A criao de interfaces no C# semelhante a criao classes, com a diferena que utilizamos a palavra reservada interface ao invs da palavra class, conforme o exemplo a seguir. public interface IPrintable { void ObterDocumento(); int NumeroPaginas(); }

No que a declarao dos mtodos nas interfaces no possuem moficador de acesso (public, private, protected). Isto ocorre pois todos os membros declarados na interface devem ser obrigatriamente pblicos. Outro detalhe importante que deve ser observado que os mtodos no possuem implementao nas interfaces. Conforme j comentamos, a interface funciona apenas como um protocolo, ou seja, no existe qualquer implementao dentro da interface. Para fazermos com que uma classe implemente uma interface, devemos utilizar a mesma notao da herana de classes, ou seja, colocar aps a declarao da classe o smbolo : e o nome da interface. Caso a classe j herde as caracteristicas de uma outra classe ou mesmo de outra interface, podemos informar uma interface adicional separando cada uma delas por vrgula. public class Recibo : IPrintable { public void ObterDocumento() { } }

Diferena entre interfaces e classes abstratas

importante salientar a diferena entre as classes abstratas e as interfaces. As classes abstratas possuem todas as funcionalidades de uma classe normal, ou seja, podem ter campos, implementao em mtodos, campos privados, etc. J as interfaces no podem conter estas estruturas, pois elas definem apenas um padro de assinatura o qual um determinado objeto deve implementar

Utilizando interfaces como parmetros ou retorno de funes


A grande vantagem na utilizao de interfaces a possibilidade de utilizarmos estas estruturas como parmetros de mtodos ou mesmo como valores de retorno de uma funo. No exemplo que avaliamos acima, poderamos implementar o mtodo Imprimir da classe impressora recebendo um parmetro do tipo IPrintable, conforme o exemplo a seguir.

Apesar de o mtodo imprimir poder receber objetos dos mais variados tipos como parmetro atravs da classe IPrintable, note que as nicas funes disponveis para chamada so as funes implementadas na interface. importante definirmos uma interface com todos os mtodos necessrios para implementarmos a funcionalidade desejada.

As inferfaces padro do .NET Framework


O conceito de interface amplamente utilizado na biblioteca de classes do .NET Framwork. Voc pode perceber que muitos mtodos que chamamos at aqui aceitam como parmetro interfaces, ao invs de classes. Como exemplo podemos pegar a classe ArrayList, que j utilizamos em captulos anteriores. Podemos verificar que o mtodo AddRange recebe como parmetro qualquer objeto que implemente uma interface ICollection, o que abrange arrays de qualquer natureza, HashTables, SortedLists, etc.

A interface IEnumerable
A interface IEnumerable uma interface padro do .NET framework que permite a implementao de enumeradores. Sempre que queremos permitir que o objeto possa ser utilizado em um comando foreach, devemos implementar a interface IEnumerable. Veja o exemplo a seguir. public class Usuarios : IEnumerable { private string[] nomesArray; public Usuarios() { nomesArray = new nomesArray[4]; nomesArray[0] = "Nome 1"; nomesArray[1] = "Nome 1"; nomesArray[2] = "Nome 1"; nomesArray[3] = "Nome 1"; } public IEnumerator GetEnumerator() { return nomesArray.GetEnumerator(); } }

A interface IClonable
A interface IClonable obriga o objeto a implementar o mtodo Clone que deve criar uma cpia exata do objeto. Este tipo de interface til para casos em que queremos garantir que o objeto possa ser duplicado durante a execuo do programa. Veja o exemplo a seguir. public class Cliente : ICloneable { string m_Nome; public Cliente(string nome) { m_Nome = nome; } public object Clone() { return new Cliente(m_Nome); } }

A interface IComparable
A interface IComparable utilizada para permitir que objetos de uma classe possam ser comparados com objetos de outra classe. A interface IComparable til em situaes em que temos que implementar ordenao em colees de itens de nossa classe. Veja o exemplo. public class Cliente : IComparable { long m_CPF; public Cliente(long cpf) { m_CPF = cpf; } public int CompareTo(object obj)

{ Cliente cli = (Cliente)obj; if (cli.m_CPF > this.m_CPF) return 1; else if (cli.m_CPF < this.m_CPF) return -1; else return 0; } }

Na implementao da interface IComparable devemos retornar o valor 1 caso o valor da classe seja maior que o valor da classe comparada. Caso o valor seja menor, dever ser retornado o valor -1. Caso as duas classes tenham valores iguais, dever ser retornado o valor 0. Se tivessemos por exemplo criado um array de objetos Cliente, poderiamos perfeitamente utilizar a funo Array.Sort para ordenar os elementos Cliente do Array, tendo em vista que implementamos a interface IComparable na classe.

Matria tirada de http://www.dotnetmaniacs.com.br/dotnetmaniacs/article_view.aspx? ArticleId=68

You might also like