;

terça-feira, 22 de março de 2011

Interfaces


Já tem algum tempo que não escrevo um novo artigo. Realmente ando um tanto ocupado ultimamente, mas mesmo assim, volta e meia dou uma espiada no movimento aqui no blog, e fico atendo a participação dos leitores. Pretendo retomar meu ritmo de publicações pouco a pouco.

Hoje falaremos de Interfaces. Uma interface lembra uma classe, porém contém apenas assinaturas de métodos, propriedades, eventos ou indexadores, que devem ser implementados em uma classe. A classe ou estrutura que implementa uma interface deve implementar os membros especificados nesta interface. No exemplo a seguir, a classe ClasseImplementada implementa a interface IExemploInterface e por isto precisa ter um método void, chamado MetodoExemplo, que não receba  parâmetros.

    interface IExemploInterface
    {
        void MetodoExemplo();
    }

    class ClasseImplementada : IExemploInterface
    {
        void ISampleInterface. MetodoExemplo ()
        {
        }

        static void Main()
        {
            IExemploInterface obj = new ClasseImplementada ();
            obj. MetodoExemplo ();
        }
    }

Uma interface pode ser um membro de um namespace ou uma classe e pode conter assinaturas de métodos, propriedade, indexadores ou eventos. A interface pode herdar de uma ou mais interfaces, como podemos ver no exemplo abaixo.

    interface IControle
    {
        void Paint();
    }
    interface IAparencia
    {
        void Paint();
    }
    public class ClasseExemplo : IControle, IAparencia
    {
        void IControle.Paint()
        {
            System.Console.WriteLine("IControle.Paint");
        }
        void IAparencia.Paint()
        {
            System.Console.WriteLine("IAparencia.Paint");
        }
    }

Como disse a pouco, uma classe que implementa uma interface, deve implementar seus membros. No exemplo anterior, a classe ClasseExemplo implementa IControle e IAparencia, e seus métodos. Repare que as duas interfaces implementadas em ClasseExemplo possuem um método chamado Paint, ambos com a mesma assinatura. Assim, para diferenciar os métodos implementados usa-se o que é chamado de implementação explicita de interface, onde explicitamos qual método, de qual interface está sendo implementado, veja:

        void IControle.Paint()
        {
            System.Console.WriteLine("IControle.Paint");
        }
        void IAparencia.Paint()
        {
            System.Console.WriteLine("IAparencia.Paint");
        }

Porém, é importante ressaltar que os métodos implementados na classe não serão expostos nas instâncias da classe ClasseExemplo, e sim nas instancias das interfaces. Desta forma, para chamar estes métodos, é necessário declarar uma instancia da classe, e fazer um cast (converter) do objeto para o tipo da interface, assim:

ClasseExemplo obj = new ClasseExemplo();
//obj.Paint();  // Erro de compilação.

IControle c = (IControle)obj;
c.Paint();  // Chamada de IControle.Paint em ClasseExemplo.

IAparencia s = (IAparencia)obj;
s.Paint(); // Chamada de IAparencia.Paint em ClasseExemplo.

Fonte: http://msdn.microsoft.com/pt-br/library/ms173157.aspx e http://msdn.microsoft.com/pt-br/library/87d83y5b.aspx#Y114. Todos os exemplos foram extraídos ou baseados na documentação do MSDN.

0 comentários:

Postar um comentário