DÊVIDA COM MODIFICADOR DE ACESSO EM CLASSES

KELLY 05/08/2015 13:33:37
#449610
Bom dia a todos,

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!

TUNUSAT 05/08/2015 13:45:40
#449614
KELLY,

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.
JABA 05/08/2015 14:12:59
#449618
Kelly, acho que quando uma classe é criada sem especificar o modificador de acesso, por padrão, é colocado como [Ô]Internal[Ô] no C#. Sendo assim, o tipo ou membro pode ser acessado por qualquer código no mesmo assembly, mas não a partir de outro assembly.
ASHKATCHUP 05/08/2015 14:15:02
#449619
Segundo o MSDN, o acesso padrão das classes é PRIVATE (https://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx).

Provavelmente tu conseguiu instanciar e herdar tais classes porque teu código está dentro do mesmo NAMESPACE.
JABA 05/08/2015 14:36:18
#449628
ASHKATCHUP, eu acho que esse [Ô]Private[ô] é para os membros da classe, não para a classe em si.

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


TUNUSAT 05/08/2015 15:28:36
#449638
ASHKATCHUP e JABA,

Montem uns exemplos sofisticados para por no site!

[][ô]s,
Tunusat.
JABA 05/08/2015 15:36:31
#449640
TUNUSAT, a questão é tão simples que nem vejo necessidade para isso. O exemplo que coloquei acho que já seria o suficiente.
TUNUSAT 05/08/2015 15:43:09
#449642
JABA,

Pode até ser simples, mas é confuso PARA CARAMBA! KKKKK!

[][ô]s,
Tunusat.
KERPLUNK 05/08/2015 18:12:27
#449646
Resposta escolhida
Em resumo. Quando não especificado um modificador, o padrão é [Ô]internal[Ô], ou seja, aquela classe pode ser acessada por qualquer membro no mesmo assembly. é diferente de public, que pode ser acessado não só do mesmo assembly, mas também de qualquer membro que o referencie. Por isso é possível sim a situação que você expôs, desde que a classe derivada não tenha um nível de acesso(modificador) superior à classe base. Ou seja, classe A, herda de classe B, desde que modificador de A, não seja superior ao de B:


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[ô]
ASHKATCHUP 06/08/2015 11:01:16
#449665
JABA e KERPLUNK estão corretos.

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.
KELLY 06/08/2015 15:56:03
#449678
Sim ASHKATCHUP, concordo com você. Tanto o KERPLUNK e o JABA estão certos e gostei da explicação e obrigada por esclarecer também sobre Assembly, tinha dúvidas referente a isso, enquanto a Namespace para mim já é tranquilo.

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!
Tópico encerrado , respostas não são mais permitidas