Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Dúvida sobre níveis de acesso no curso de C# e Tópicos Avançados, no exercício do capítulo Mão na Massa - Formulários.

Estou tendo o seguinte erro...

Error    1    Inconsistent accessibility: parameter type 'ShieldTech.ContaBancaria.Contas.Conta' is less accessible than method 'ShieldTech.ContaBancaria.Form1.AdicionaContas(ShieldTech.ContaBancaria.Contas.Conta)'

Sei que para resolver esse erro, tenho que tornar minha classe Conta pública, pois segundo a explicação dada no curso, como o método é publico e a classe é privada, teriam momentos em que o método seria visto e a classe não, e por conta disso o C# gera o erro de compilação.

A minha dúvida é, quando uma classe privada não é vista? Pois eu meus testes eu sempre consigo criar instancias dessa classe, dentro de outras classes que são públicas inclusive. Eu gostaria de um exemplo prático onde essa classe não é vista, para mim não mudar só por mudar a classe para pública, mais sim entender o real motivo disso.

4 respostas

Opa Adriano, tudo bom? A classe ser privada significa que quando você gerar uma DLL para o seu projeto por exemplo, quem importar sua DLL não irá conseguir enxergar as classes que são privadas apenas as públicas. Por exemplo imagina que você está fazendo uma aplicação que tem as classes Conta, ContaCorrente e ContaPoupanca além de uma classe ManipuladorDeSaldo que as classes usam para reaproveitar o código com composição. Quem for utilizar a API não precisa saber da existencia da classe ManipuladorDeSaldo muito menos dar new nessa classe. Portanto deixando ela privada só vai ser possível acessar de outro projeto as classes Conta ContaCorrente e ContaPoupanca.

Espero ter ajudado. Abraços.

Opa Renan obrigado pela atenção. Acho que entendi, só para confirmar, uma classe privada no projeto X, poderá ser instanciada em todo o projeto X. porém quando eu for utilizar esse projeto como parte de um outro projeto Y, somente as classes públicas do projeto X serão vistas pelo projeto Y?

solução!

Adriano, acredito que o que você esteja se referindo à uma classe que não é pública, certo? Tipo essa:

class UmaClasseQualquer
{
    //código
}

Nessa classe nós omitimos o modificador de acesso(https://msdn.microsoft.com/pt-br/library/wxh6fsc7.aspx), portanto a visibilidade dela é internal, não privada como você está dizendo.

Uma classe que é internal pode ser vista somente dentro do assembly que ela faz parte. Assembly é uma unidade de código C# compilado - geralmente DLL ou EXE. E os assemblys em nossa aplicação acabam sendo os projetos - quando você compila eles, eles se "transformam" em EXEs e/ou DLLs.

Então uma classe sem modificador de acesso pode ser vista apenas dentro de um projeto. Se ela for pública, pode ser vista e instanciada/utilizada de outros projetos :)

Resumindo: o que você falou está certo, mas trocando a "classe privada" por "classe internal".

Classes privadas podem ser declaradas apenas dentro de outras classes, dê uma olhada em Nested Types: https://msdn.microsoft.com/en-us/library/ms173120.aspx ;)

Olá Gabriel Feirreira, obrigado pela resposta ficou claro agora.