Implementação Explícita de Interface em C#

quarta-feira, 13 de janeiro de 2010 Postado por Luis Fernando

Alguns livros, como por exemplo o Visual C# 2008 passo-a-passo, recomendam fortemente o uso de implementação explícita de interface.

Considere o código;

interface IExemplo
{
    void imprime();
}

class ClasseA : IExemplo
{
    public void imprime() { }
    public void carrega() { }
}

class ClasseB : IExemplo
{
    void IExemplo.imprime() { }
    public void carrega() { }
}

class Program
{
    static void Main(string[] args)
    {
        ClasseA a = new ClasseA();
        a.imprime();
        a.carrega();

        IExemplo b = new ClasseB();
        b.imprime();
        // O método "carrega()" é inacessível a "b"!
    }
}

A questão é: dessa forma, o objeto “b” não pode acessar o método “carrega()”, então, eu perco o acesso aos métodos próprios da classe ClasseB?

Não é bem assim...

Essa implementação é boa para o caso de uma classe implementar várias interfaces que podem ter métodos com a mesma assinatura.

Acompanhe mais um exemplo;

interface IExemplo
{
    void imprime();
}

class Classe : IExemplo
{
    void IExemplo.imprime()
    {
        Console.WriteLine("Impressão da IExemplo");
    }

    void imprime()
    {
        Console.WriteLine("Impressão da classe");
    }

    static void Main(string[] args)
    {
        IExemplo ex = new Classe();
        ex.imprime();
        (ex as Classe).imprime();
        Console.ReadKey();
    }
}
  • output
  • Impressão da IExemplo
  • Impressão da classe
    Não, você não perde acesso aos métodos da classe, mas programar com abstração leva a esse tipo de "problema" (se é que podemos chamar isso de problema).
    O que você pode fazer é, já que a variável é do tipo interface, e a classe implementa essa interface, a variável pode sofrer casting pro tipo da classe, fazendo você "ganhar" acesso a tudo que a classe tem de métodos.
    E sim, é muito mais limpo programar DESTA forma, do que criar um bilhão de classes com vários métodos diferentes e sair criando levas de objetos pra poder acessar métodos distintos quando tudo que você tem de fazer é criar uma abstract class ou uma interface.
  1. Anônimo

    Show brother, boa explicação que Deus lhe abençoe.

Postar um comentário