Array
(
)

C# - interfaces - objeto instanciado

Fábio Kretzschmar
   - 28 out 2011

Ficarei muito grato se alguém puder eliminar a minha dúvida. De acordo com o código mais abaixo (http://msdn.microsoft.com/pt-br/library/87d83y5b.aspx), eu posso utilizar a seguinte instrução?
ImplementationClass obj = new ImplementationClass();
Por que declarar a variável “obj” da classe ISampleInterface, sendo que eu implemento o método na classe ImplementationClass? E mais, como a variável “obj” do tipo ISampleInterface comporta/aceita um método da classe ImplementationClass, sem relação com a interface ISampleInterface?
#Código
interface ISampleInterface
{
void SampleMethod();
}
class ImplementationClass : ISampleInterface
{
void ISampleInterface.SampleMethod()
{
// Method implementation.
}
static void Main()
{
ISampleInterface obj = new ImplementationClass();
obj.SampleMethod();
}
}

Fábio Kretzschmar
   - 28 out 2011

Pessoal, no VS 2010 eu não consigo utilizar a instrução abaixo (de acordo com o código completo). Por que? Encontrei na web explicações que afirmam que é possível. Realmente não entendo o que é correto.

#CódigoImplementationClass obj = new ImplementationClass();

Ao compilar, a seguinte mensagem aparece:

WindowsFormsApplication1.ImplementationClass does not contain a definition for SampleMethod and no extension method SampleMethod accepting a first argument of type WindowsFormsApplication1.ImplementationClass could be found (are you missing a using directive or an assembly reference?)

Obrigado!

Joel Rodrigues
   - 01 nov 2011

Questão: eu posso utilizar a seguinte instrução: ImplementationClass obj = new ImplementationClass(); ?
Resposta: Sim, essa instrução apenas instancia um objeto da classe ImplementationClass
=========================================================================================================
Questão: Por que declarar a variável “obj” da classe ISampleInterface, sendo que eu implemento o método na classe ImplementationClass?
Resposta: Bem, ISampleInterface não é uma classe e sim uma interface. Declarando dessa forma, o objeto obj pode ser não só do tipo ImplementationClass mas de qualquer classe que implemente a interface ISampleInterface.
Exemplo: Imagine a interface IAnimal. Várias classes como Cachorro, Bode e Marreco implementam essa interface. Se eu declarar meu objeto como IAnimal, ele pode ser de qualquer um desses tipos citados. Lembrando que você não pode instanciar uma interface, ela é apenas um mdoelo.
=========================================================================================================
Questão:como a variável obj do tipo ISampleInterface comporta/aceita um método da classe ImplementationClass, sem relação com a interface ISampleInterface?
Resposta: Como assim sem relação? A classe ImplementationClass implementa a interface ISampleInterface ou seja, ela dá funcionalidade, na prática, aos métodos dessa interface. Nesse caso, o método SampleMethod não é diretamente da classe e sim da interface, a classe apenas o implementa.
=========================================================================================================

A estrutura/sintaxe desse código está correta. Eu sugiro que faça o seguinte: escreva a interface e a classe em arquivos separados e instancie o objeto em outro local. Essa estrutura que você está utilizando as vezes confunde, principalmente para quem está iniciando.

Qualquer dúvida, posta aí.
Abraço.

Joel Rodrigues
   - 01 nov 2011

Na dúvida, me manda um email que eu te passo uns exemplos e te explico melhor.
joelrlneto@gmail.com