Implementação Explícita de Interface em C#
quarta-feira, 13 de janeiro de 2010
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.
Marcadores:
Boas Práticas,
Csharp,
Interface
Show brother, boa explicação que Deus lhe abençoe.