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.