none
Dúvidas sobre Interface. RRS feed

  • Pergunta

  • Olaa,

     

                     Estou estudando interfaces e possuo as seguintes dúvidas:

     

    1) Porque a interface so deve conter a assinatura do método sem o modificador de acesso ? Qual o problema no uso do modificador de acesso na declaração dos métodos na interface ?

     

    2) Porque para se chamar um método que foi inicialmente declarado na Interface e que foi implementado em uma classe  foi necessário : ISampleInterface obj = new ImplementationClass() ??

    Segue abaixo o exemplo para melhor Visualização.


    interface ISampleInterface
    {
     string SampleMethod();
    }
    
    class ImplementationClass : ISampleInterface
    {
     string ISampleInterface.SampleMethod()
     {
     return "Interface";
     }
    
     static void Main()
     {
     // Porque para chamar um membro da Interface foi realizada a operação abaixo ? Qual o significado da mesma ?
     ISampleInterface obj = new ImplementationClass();
    
     obj.SampleMethod();
     }
    }
    3) Quando uma classe extende uma interface e implementa um método e é colocado o modificador de acesso é gerado um erro: The modifier 'public' is not valid for this item... Porque não deve-se expecificar o modificador de acesso nessa situação
    Desde Já, Agradeço.



    sábado, 9 de julho de 2011 04:46

Respostas

  • 1) Por que os métodos de interface não podem ser estáticos ?

    por causa disso:http://stackoverflow.com/questions/259026/why-doesnt-c-allow-static-methods-to-implement-an-interface

     

     

    2) ISampleInterface obj = new ImplementationClass();

    Pelo que pude entender o conceito de polimorfismo é diretamente aplicado no exemplo acima, posso afirmar que "obj" é do tipo ImplementationClass(), ou seja, ele assume essa forma, somente  assim pode-se acessar os elementos de ImplementationClass()??

     

     

    Nao entendi. Creio que sua idéia de polimorfismo esteja errada. O que vc esta fazendo acima é instanciando uma classe ImplementationClass

    Para haver polimorfismo, vc teria que criar uma outra classe herdadada de ImplementationClass e alterar um dos seu métodos.

    http://msdn.microsoft.com/pt-br/library/ms173152(v=vs.80).aspx

     

    3) Porque não se pode instanciar um método abstrato diretamente ?

    Porque uma classe abstrata, por definiçao, nao é completa. Isso obriga a criar uma classe baseada nela.

    Att

     


     


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    SOGI INFORMATIQUE LTÉE (http://www.sogi.com)
    terça-feira, 12 de julho de 2011 14:26
    Moderador
  • Rodrigo,

    Pelo tipo das suas dúvidas é provável que valha a pena você visitar alguns outros conceitos de OOP como herança e polimorfismo. Podem te ajudar a entender melhor o funcionamento das interfaces.

    Acho que esse post pode te ajudar: http://ericlemes.com/2009/03/03/dotnet-oop/

    Respondendo as tuas dúvidas:

    1) Uma interface é ocmo se fosse um "contrato" entre duas implementações. Uma forma de você interagir com outro objeto sem conhecer sua implementação totalmente. Sendo assim, se você precisa "expor" coisas de uma classe através de uma interface, essa exposição automaticamente implica que tudo é público. Não faria menor sentido uma interface com membros privados.

    2) É o conceito de polimorfismo sendo aplicado. Um objeto assumindo várias formas (poli=várias, morfos=formas). Não dá para instanciar uma interface diretamente porque a mesma é "abstract", ela não contém implementação de nada. O objetivo de utilizar a interface invés da própria classe do objeto é justamente conseguir interagir com este objeto sem conhecer sua implementação. É uma forma muito eficiente de reduzir o acoplamento de uma aplicação e simplificar a manutenção dela.

     

    Abraço,

    Eric

    segunda-feira, 11 de julho de 2011 12:33
  • @Rodrigo

    Existe muita informacao sobre interface, e pouca explicacao boa. Porque devo usar interface e quando nao devo usar interface?

    voce nao precisa usar interface quando programa, mais e bom usar interface quando se programas. 

    quando se deve usar interface?

    voce usa interface quando tens um team - equipa - de programadores a desenvolver o mesmo projecto. A Interface diz como as classes devem funcionar e como devem ser programadas.

    Se voce tiver na interface um boleano entao na classe vais ter um boleano, se o programador utilizar um int entao vai gerar erro. desta forma voce evita bug quando juntar ou compilar todo o projecto desenvolvido pelo grupo de programadores.

    Quando se programa com interface --- a interface nunca muda uma vez "compilada" criada voce nao conseguese mudar, mais as classes voce pode mudar quando voce quizer.

    quando voce usa interface --- escreve-se menos codigo do que apenas programar com classes.

    Se voce nao quer usar interface --- voce pode usar abstract class, ironico.

    Leia a dica do @Eric. http://www.codeproject.com/KB/cs/abstractsvsinterfaces.aspx

    Voce nao precisa usar interface se estiver a desenvolver um programa simples. talvez uma agenda. basta usar class e pronto. 

     


    One word frees us of all the weight and pain of life: that word is love.
    segunda-feira, 11 de julho de 2011 12:58

Todas as Respostas

  • Rodrigo, tudo bem? Vamos às suas dúvidas:

    1) Porque a interface so deve conter a assinatura do método sem o modificador de acesso ? Qual o problema no uso do modificador de acesso na declaração dos métodos na interface ?

    R: Dentro de uma Interface, todos os métodos são, implicitamente, public e abstract. Sendo assim, você não precisa se preocupar em declarar o modificador de acesso.

     

    2) Porque para se chamar um método que foi inicialmente declarado na Interface e que foi implementado em uma classe  foi necessário : ISampleInterface

      obj = new ImplementationClass() ??

    R: Esse é um conceito chamado Herança. Usando o : NomeDaInterface, você está "dizendo" para o compilador que está herdando seus

    métodos e suas particularidades. Mais sobre Herança nos artigos abaixo, escritos por mim:

    http://programandodotnet.wordpress.com/tag/heranca/

     

    3) Quando uma classe extende uma interface e implementa um método e é colocado o modificador de acesso é gerado um erro: The modifier 'public' is not valid for this item... Porque não deve-se expecificar o modificador de acesso nessa situação

    R: Isso acontece pelo que já foi falado na resposta da sua 1ª dúvida, nestes casos o modificador de acesso não deve ser declarado.


    Mais sobre Interfaces nos seguintes artigos (os 2 últimos são de minha autoria):

    http://danielteofilo.wordpress.com/2011/04/03/um-pouco-sobre-interfaces/

    http://eufacoprogramas.wordpress.com/2011/04/12/interfaces-no-c/

    http://programandodotnet.wordpress.com/2011/02/04/interfaces-parte-1/

    http://programandodotnet.wordpress.com/2011/02/05/interfaces-parte-2/

     

    Veja uma discussão sobre Classe Abstrata x Interfaces, aqui do MSDN, que pode lhe ser útil:

    http://social.msdn.microsoft.com/Forums/pt-BR/vsgeralpt/thread/89b4f1f8-7a92-4815-b845-b9285b4d8b06

     

    Espero ter esclarecido suas dúvidas.

    Abraços.


    Se a resposta for útil, favor votar como útil para que ajude outros usuários com a mesma dúvida | Dicas e artigos sobre .NET em http://programandodotnet.wordpress.com e http://www.devmedia.com.br/wellingtonbalbo | Siga-me no Twitter: @wellingtonbalbo
    segunda-feira, 11 de julho de 2011 00:35
  • Rodrigo,

    Pelo tipo das suas dúvidas é provável que valha a pena você visitar alguns outros conceitos de OOP como herança e polimorfismo. Podem te ajudar a entender melhor o funcionamento das interfaces.

    Acho que esse post pode te ajudar: http://ericlemes.com/2009/03/03/dotnet-oop/

    Respondendo as tuas dúvidas:

    1) Uma interface é ocmo se fosse um "contrato" entre duas implementações. Uma forma de você interagir com outro objeto sem conhecer sua implementação totalmente. Sendo assim, se você precisa "expor" coisas de uma classe através de uma interface, essa exposição automaticamente implica que tudo é público. Não faria menor sentido uma interface com membros privados.

    2) É o conceito de polimorfismo sendo aplicado. Um objeto assumindo várias formas (poli=várias, morfos=formas). Não dá para instanciar uma interface diretamente porque a mesma é "abstract", ela não contém implementação de nada. O objetivo de utilizar a interface invés da própria classe do objeto é justamente conseguir interagir com este objeto sem conhecer sua implementação. É uma forma muito eficiente de reduzir o acoplamento de uma aplicação e simplificar a manutenção dela.

     

    Abraço,

    Eric

    segunda-feira, 11 de julho de 2011 12:33
  • @Rodrigo

    Existe muita informacao sobre interface, e pouca explicacao boa. Porque devo usar interface e quando nao devo usar interface?

    voce nao precisa usar interface quando programa, mais e bom usar interface quando se programas. 

    quando se deve usar interface?

    voce usa interface quando tens um team - equipa - de programadores a desenvolver o mesmo projecto. A Interface diz como as classes devem funcionar e como devem ser programadas.

    Se voce tiver na interface um boleano entao na classe vais ter um boleano, se o programador utilizar um int entao vai gerar erro. desta forma voce evita bug quando juntar ou compilar todo o projecto desenvolvido pelo grupo de programadores.

    Quando se programa com interface --- a interface nunca muda uma vez "compilada" criada voce nao conseguese mudar, mais as classes voce pode mudar quando voce quizer.

    quando voce usa interface --- escreve-se menos codigo do que apenas programar com classes.

    Se voce nao quer usar interface --- voce pode usar abstract class, ironico.

    Leia a dica do @Eric. http://www.codeproject.com/KB/cs/abstractsvsinterfaces.aspx

    Voce nao precisa usar interface se estiver a desenvolver um programa simples. talvez uma agenda. basta usar class e pronto. 

     


    One word frees us of all the weight and pain of life: that word is love.
    segunda-feira, 11 de julho de 2011 12:58
  • Incialmente gostaria de agradecer a atenção de todos, mas possuo ainda algumas dúvidas:

     

    1) Porque os métodos de interface não podem ser estáticos ?

     

    3) Porque não se pode instanciar um método abstrato diretamente ?

     

    2) ISampleInterface obj = new ImplementationClass();

    Pelo que pude entender o conceito de polimorfismo é diretamente

    aplicado no exemplo acima, posso afirmar que "obj" é do tipo

    ImplementationClass(), ou seja, ele assume essa forma, somente

    assim pode-se acessar os elementos de ImplementationClass()??

     

    Novamente muito obrigado.

    terça-feira, 12 de julho de 2011 04:53
  • 1) Por que os métodos de interface não podem ser estáticos ?

    por causa disso:http://stackoverflow.com/questions/259026/why-doesnt-c-allow-static-methods-to-implement-an-interface

     

     

    2) ISampleInterface obj = new ImplementationClass();

    Pelo que pude entender o conceito de polimorfismo é diretamente aplicado no exemplo acima, posso afirmar que "obj" é do tipo ImplementationClass(), ou seja, ele assume essa forma, somente  assim pode-se acessar os elementos de ImplementationClass()??

     

     

    Nao entendi. Creio que sua idéia de polimorfismo esteja errada. O que vc esta fazendo acima é instanciando uma classe ImplementationClass

    Para haver polimorfismo, vc teria que criar uma outra classe herdadada de ImplementationClass e alterar um dos seu métodos.

    http://msdn.microsoft.com/pt-br/library/ms173152(v=vs.80).aspx

     

    3) Porque não se pode instanciar um método abstrato diretamente ?

    Porque uma classe abstrata, por definiçao, nao é completa. Isso obriga a criar uma classe baseada nela.

    Att

     


     


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    SOGI INFORMATIQUE LTÉE (http://www.sogi.com)
    terça-feira, 12 de julho de 2011 14:26
    Moderador
  • Rodrigo,

    Conseguiu solucionar essa questão?


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    sexta-feira, 5 de agosto de 2011 17:05
    Moderador
  • Olaa,

     

    Inicialmente peço desculpas pela demora em responder. O problema foi resolvido, minha dúvida foi sanada.

     

     

    Novamente obrigado pela atenção de todos.

    quinta-feira, 18 de agosto de 2011 17:09