Hugo,
Consegui emular o erro aqui! O problema é esse PRIVATE de herança.
using bytebank_ADM.SistemaInterno;
namespace bytebank_ADM.Parceria
{
public class ParceiroComercial:IAutenticavel
{
public string Senha { get; private set; }
public bool Autenticar(string senha)
{
return this.Senha == senha;
}
}
}
- Gravidade: Erro
- Código: CS0277
- Descrição: "ParceiroComercial" não implementa membro de interface "IAutenticavel.Senha.set". "ParceiroComercial.Senha.set" não é público.
- Projeto: bytebank_ADM
- Arquivo: ParceiroComercial.cs
- Linha: 5
- Estado de Supressão: Ativo
Vamos tentar entender...
===============================================================
Erro do Compilador CS0277
Artigo - 06/04/2023
"class" não implementa o membro da interface "accessor". "class accessor" não é público
Esse erro ocorre quando você tenta implementar uma propriedade de uma interface, mas a implementação do acessador de propriedade na classe não é pública. Os métodos que implementam membros da interface precisam ter acessibilidade pública. Para resolver, remova o modificador de acesso do acessador de propriedade.
Exemplo
O seguinte exemplo gera o erro CS0277:
// CS0277.cs
public interface MyInterface
{
int Property
{
get;
set;
}
}
public class MyClass : MyInterface // CS0277
{
public int Property
{
get { return 0; }
// Try this instead:
//set { }
protected set { }
}
}
https://learn.microsoft.com/pt-br/dotnet/csharp/misc/cs0277
===============================================================
Neste caso a propriedade SET da interface HERDADA está um mais restrição do que da origem na interface.
Acredito que NÃO pode fazer isso por regra do próprio C#... agora NÃO entendi se é obrigatório usar "PUBLIC" sempre...
... TESTANDO JÁ!
namespace bytebank_ADM.SistemaInterno
{
public interface IAutenticavel
{
public string Senha { get; private protected set; }
public bool Autenticar(string senha);
}
}
using bytebank_ADM.SistemaInterno;
namespace bytebank_ADM.Parceria
{
public class ParceiroComercial:IAutenticavel
{
public string Senha { get; set; }
public bool Autenticar(string senha)
{
return this.Senha == senha;
}
}
}
O "Private Protected" deixa a classe derivada usá-lo, portanto, segundo a planilha acima, é permitido herdar.
Assim funciona, NÃO precisa ser sempre PUBLIC, só NÃO pode ser PRIVATE, pois o PRIVATE NÃO deixa a INTERFACE herdar. Mas que herda precisa herdar o que estiver na interface ... ou não? Não aceita nem se eu colocar explicitamente PUBLIC no SET do "ParceiroComercial".
RESUMINDO:
Se você colocar a restrição na própria interface, tudo bem, mas só NÃO pode ser do tipo PRIVATE, pois essa NÃO permite a herança trabalhar.
Quem herda (ParceiroComercial) NÃO pode ter NENHUM modificador de acesso, nem mesmo PUBLIC... isso eu achei estranho...
[]'s,
Fabio I.