DÊVIDA COM MODIFICADOR DE ACESSO EM CLASSES
Esses dias ao fazer umas implementações em uma aplicação, percebi algo que não havia visto antes. No sistema tinha classes abstratas herdadas e classes concretas(herdadas em algumas partes da aplicaçõe e em outras, instânciadas).
Ao analisar a estrutra desses dois tipos de classe, percebi que ambas não tinha o modificador de acesso PUBLIC, então surgiu a grande dúvida. Por que mesmo sem o modificador de acesso PUBLIC foi possÃvel instanciar e herdar essas classes?
Grata a todos!
Desculpe, se é que eu entendi, acho que você está confundindo os conceitos de Public, Instance Constructors e Inheritance.
==================================================
public (Referência de C#)
https://msdn.microsoft.com/pt-br/library/yzh058ae(v=vs.120).aspx
==================================================
Construtores de instâncias (Guia de Programação em C#)
https://msdn.microsoft.com/pt-br/library/k6sa6h87(v=vs.120).aspx
==================================================
Herança (Guia de Programação em C#)
https://msdn.microsoft.com/pt-br/library/ms173149(v=vs.120).aspx
==================================================
Achei algo mais interessante:
==================================================
Modificadores de acesso (Guia de Programação em C#)
https://msdn.microsoft.com/pt-br/library/ms173121(v=vs.120).aspx
==================================================
Modificadores de acesso (Referência de C#)
https://msdn.microsoft.com/pt-br/library/wxh6fsc7(v=vs.120).aspx
==================================================
herança de classes com modificadores de acesso diferente
https://social.msdn.microsoft.com/Forums/pt-BR/6c4f2ab5-4cfe-4208-926f-3f23640e0722/herana-de-classes-com-modificadores-de-acesso-diferente?forum=vscsharppt
==================================================
Nested Types (C# Programming Guide)
https://msdn.microsoft.com/en-us/library/ms173120(v=vs.80).aspx
==================================================
Você pode instanciar e / ou herdar uma classe se estiver no mesmo projeto, no mesmo código...
Citação:- Pública
O tipo ou membro pode ser acessado por qualquer outro código no mesmo assembly ou outro conjunto que faz referência a ele.
- Particular
O tipo ou membro pode ser acessado somente pelo código na mesma classe ou struct.
- Protegido
O tipo ou membro pode ser acessado somente pelo código na mesma classe ou struct ou em uma classe derivada da classe.
- Interno
O tipo ou membro pode ser acessado por qualquer código no mesmo assembly, mas não a partir de outro assembly.
- Protected Internal
O tipo ou membro pode ser acessado por qualquer código no assembly no qual ele está declarado ou de uma classe derivada em outro assembly. Acesso a partir de outro assembly deve ocorrer dentro de uma declaração de classe que deriva da classe na qual o elemento interno protegido é declarado e ele deverá ser feita por meio de uma instância do tipo classe derivada.
Tente testar as formas de acessar criando um projeto exemplo.
==================================================
http://www.guj.com.br/java/281140-c---modificadores-de-acesso
C# - Modificadores de acesso XML
Citação:Li que em C#, quando não há um modificador de acesso [como private, protected, public, internal] especificado, o padrão é private.
==================================================
[][ô]s,
Tunusat.
Provavelmente tu conseguiu instanciar e herdar tais classes porque teu código está dentro do mesmo NAMESPACE.
Veja o texto que está acima daquela tabela com os modificadores:
Citação:[Ô]Nested types, which are members of other types, can have declared accessibilities as indicated in the following table.[Ô]
Ou seja, essa tabela só é válida para os membros dentro das classes.
Citação:[Ô]Top-level types, which are not nested in other types, can only have internal or public accessibility. The default accessibility for these types is internal.[Ô]
Ou seja, se uma classe não está dentro de outra, apenas pode ser usado internal ou public e o padrão é internal. Se quisermos declarar uma classe como private, teremos que criá-la dentro de outra.
Ex:
class Teste1{
private class Teste2 {
}
}
Teste1 é internal e Teste2 é privado
Montem uns exemplos sofisticados para por no site!
[][ô]s,
Tunusat.
Pode até ser simples, mas é confuso PARA CARAMBA! KKKKK!
[][ô]s,
Tunusat.
internal class B
{
int X {get; set; }
}
public class A : B
{
int X {get; set; }
}
A situação acima gerará um erro porque A é public, mas B, a classe base é internal.
A tÃtulo de curiosidade, a exceção gerada é:
Error 4 Inconsistent accessibility: base class [ô]Framework.Entidades.A[ô] is less accessible than class [ô]Framework.Entidades.B[ô]
Segundo o MSDN (https://msdn.microsoft.com/en-us/library/ms173121.aspx):
Citação:Classes and structs that are declared directly within a namespace (in other words, that are not nested within other classes or structs) can be either public or internal. Internal is the default if no access modifier is specified.
A diferença entre Assembly e Namespace está detalhada no seguinte artigo: https://msdn.microsoft.com/en-us/library/ms973231.aspx
Por último, não vejo sentido em criar exemplo pra postar aqui. Há muito material na internet, em especial no MSDN.
O forum podia ter opções para marcar mais de uma resposta, isso acabou sendo injusto no FORUM, sendo que cada resposta pode complementar algo que outro deu.
Referente aos exemplos, não vejo mal algum mesmo sabendo que tem na internet, nem sempre os exemplos encontrados na internet são simples e especÃficos.
Obrigada a todos pelas explicações!