none
Implementação de Interface RRS feed

  • Pergunta

  • Pessoal , estou com dúvida para implementar uma interface.

     public interface IPhotoSharingContext
     {
         IQueryable<Photo> Photos { get; }
     }

    Por que se eu implementar o método assim dá erro ?

    IQueryable<Photo> Photos
    {
         get { return Photos; }
    }


    Por que tem que ser desse jeito ?

    IQueryable<Photo> IPhotoSharingContext.Photos
    {
        get { return Photos; }
     }

    quinta-feira, 26 de junho de 2014 21:44

Todas as Respostas

  • Boa noite Ricardo...creio que você não a implementou...

    Veja em seguida ao nome da sua classe depois dos dois pontos, sobre o nome da sua interface dê um Ctrl + .(ponto) ou clique sobre o nome da interface com o botão direito e clique sobre a mensagem "Implement Interface". Acredito que isso vai resolver, abraço!!!

    sexta-feira, 27 de junho de 2014 00:35
  • Olá Ricardo,

     isso acontece porque uma interface possui regras ou seja quando você implementa sua interface quem garante que sua propriedade Photos é da interface ? 

      Uma das especificação de interface é : O nome do método se inicia com o nome da interface, isso é conhecido como implementação explicita de interface e é um bom hábito a cultivar.

      Você ficou em um desses erros que está nas regras da interface ou seja seu Photo sem o nome da interface não é "uma garantia que é o Photo da interface" !

     Para tentar explicar melhor no seu 1 exemplo :

    IQueryable<Photo> Photos
    {
         get { return Photos; }
    }

     Isso seria declarar uma interface implicitamente ou seja quando declara sua interface implicitamente seu método deve ser sempre public, isso é regra !

    Agora quando você faz :

    IQueryable<Photo> IPhotoSharingContext.Photos
    {
        get { return Photos; }
     }
     Você declara sua interface Explicitamente com isso pode ser privado seu método pois você pode chamar sua interface diretamente para uma class para usar o método na classe !

     

    • Editado Daniel Brito br sexta-feira, 27 de junho de 2014 01:23 Mais informações
    sexta-feira, 27 de junho de 2014 00:37
  • Boa noite Diego, eu implementei a interface sim :

     public class PhotoSharingContext : DbContext, IPhotoSharingContext

    sexta-feira, 27 de junho de 2014 01:55
  • Boa noite Diego, eu implementei a interface sim :

     public class PhotoSharingContext : DbContext, IPhotoSharingContext

     Ricardo,

      leia o post acima, esse erro é por causa da implementação Implicita que deve ser public, e explicita permite ser private ! 

    sexta-feira, 27 de junho de 2014 01:59
  • Olá Daniel,

    A classe que implementa a interface está assim :

     public DbSet<Photo> Photos { get; set; }
            
     IQueryable<Photo> IPhotoSharingContext.Photos
     {
          get { return Photos; }
     }

    Então sempre que eu for retornar uma propriedade num método implementado de uma interface eu preciso fazer dessa forma ?

    sexta-feira, 27 de junho de 2014 02:01
  •  Não,

     pode declarar como public implicitamente veja :

    public DbSet<Photo> Photos { get; set; }
            
     public IQueryable<Photo> Photos
     {
          get { return Photos; }
     }
     Explicitamente não precisa ser public do modo anterior mas assim precisa !

    sexta-feira, 27 de junho de 2014 02:06
  • Daniel, eu só uso interface explicita quando eu implemento 2 interfaces e nessas interfaces eu tenho um método com mesma assinatura, então para eu saber de qual interface eu estou implementando o método eu coloco o nome da interface antes dele.

    Eu coloquei o public como você falou no ultimo post e apareceu uma mensagem de erro dizendo que a minha classe já contém uma definição para Photos.

    Só que esse erro é por que a propriedade Photos já é retornada no

    public DbSet<Photo> Photos { get; set; }

    Então quando eu mando retornar Photos no método implementado da interface dá esse erro , pois eu já retorno Photos na propriedade , esse meu pensamento está correto ?


    sexta-feira, 27 de junho de 2014 13:25