none
Modificadores de acesso na classe RRS feed

  • Pergunta

  • Quando criamos uma classe em .Net, automaticamente vemos:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace ConsoleApplication
    {
        class MinhaClasse
        {
    ...

    Acredito que por padrao, quando criamos uma classe sem modificador de acesso, essa sera Private.
    Mas vejo que mesmo mudando o modificador de acesso da classe entre public, private, protected, sealed, etc, nao faz nenhuma diferenca quando vou criar uma instancia dessa classe numa outra classe.

    Pq ? Isso so faz sentido pra propriedades e metodos ?


    • Editado AGA Neto terça-feira, 17 de novembro de 2015 05:48
    terça-feira, 17 de novembro de 2015 05:47

Todas as Respostas

  • Bom dia, tudo bem?

    Faz todo o sentido sim.

    Antes veja esses artigos, vai te ajudar a entender cada um dos modificadores de acesso.

    https://msdn.microsoft.com/pt-br/library/ms173150.aspx

    https://msdn.microsoft.com/pt-br/library/wxh6fsc7.aspx

    Veja esse exemplo, tenho uma classe cliente

    public class Cliente
    {
    
    public Cliente(string nome)
    {
      ValidarNome();
      this.Nome = nome;
    }
    
    public int Id {get;private set;}
    public string Nome {get;private set;}
    
    public void AlterarNome(string nome)
    {
    
      ValidarNome();
    
       this.Nome = nome;
    }
    
    private void ValidarNome()
    {
    
       if(string.IsNullOrEmpty(nome))
    
          throw new Exception("Nome inválido");
    
    }
    
    }
    

     

    Existem arquiteturas de software que vão contra você alterar o estado de uma classe livremente simplesmente instanciando a mesma, em DDD por exemplo, uma boa prática é você SEMPRE iniciar uma classe por seu construtor e fazer alterações via métodos para que possa ter um controle de validação dos dados que estão sendo alterados. Mas como fazer isso?

    Com propriedades com set privado por exemplo...é uma forma, veja...

    //isso você não vai poder fazer na classe Cliente
    var cliente = new Cliente();
    cliente.Nome = "Diego";

    somente assim...porque para eu ter uma instancia de cliente, ele obrigatoriamente DEVE TER UM NOME.

    var cliente = new Cliente("Diego");
    cliente.AlterarNome("Raquel");




    terça-feira, 17 de novembro de 2015 10:20
  • Entendo o que disse, mas ainda assim minha pergunta permanece.

    Quando uso modificadores de acesso para metodos e propriedades, isso funciona corretamente.

    Mas quando uso em classes, nao faz nenhuma diferenca.
    Mesmo private por ex, eu consigo instancia-la.


    terça-feira, 17 de novembro de 2015 19:15
  • Boa noite, AGA.
    Classes privadas normalmente são utilizadas dentro de outras classes. Ex.:

    public class X
    {
    	private class Y
    	{
    
    	}
    }

    Neste exemplo, a classe X terá acesso a todos atributos, métodos, etc. da classe privada Y, porém nenhuma outra classe terá este acesso.


    Att., Rafael Simor

    terça-feira, 17 de novembro de 2015 22:28
  • AGA, com certeza muda, você consegue instancia-la dependendo do nível de acesso, faz um teste!

    Cria um projeto com uma classe privada. 

    Cria um outro projeto, adicione a referência do primeiro projeto que contém a classe e tenta fazer a instância no segundo projeto, você não vai conseguir

    Depois, mude o acesso da classe para public, aí você vai conseguir.

    PrimeiroProjeto
           ClasseTeste privada

    Segundo Projeto (adiciona referência do PrimeiroProjeto)

    cria uma classe qualquer e tente fazer dentro dessa classe = ClasseTeste obj = new ClasseTeste(); ele não vai conseguir identificar a classe.


    • Editado Diego de Oliveira Neves terça-feira, 17 de novembro de 2015 23:21
    • Sugerido como Resposta SimorC quarta-feira, 18 de novembro de 2015 00:28
    terça-feira, 17 de novembro de 2015 23:19