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

Código simplificado não funcionando

O seguinte código não funciona. O erro é "Cliente.Cliente() is inaccessible duo its level protection", só que minha classe Cliente, esta como public (ver fim do post)

Cliente c = new Cliente() {
 Cpf = "123489023-09", 
Rg = "123-4" 
};

Se eu fizer de outras formas, como colocar os parametros direto na criação da classe, funciona .

Cliente c = new Cliente("1213123-CPF", "123131-RG");
class Cliente
    {
        public string Nome { get; set; }
        public string Rg { get; set; }
        public string Endereco { get; set; }
        public string Cpf { get; set; }
        public int idade { get; set; }

        public Cliente (string rg, string cpf)
        {

            this.Rg = rg;
            this.Cpf = cpf;
        }
6 respostas

Bruno, é porque na tua classe Cliente tu sobreescreveu o construtor padrão que é aquele que não recebe parametros. Então do modo que tu fez, toda vida que tu for instanciar um cliente tu obrigatoriamente precissar passar esses dois parametros pra ele, rg e cpf

Sim, isso eu entendi. Mas quando eu coloco esse parametros em outra linha, como no primeiro caso :

Cliente c = new Cliente() {
 Cpf = "123489023-09", 
Rg = "123-4" 
};

Não deveria funcionar? Ou obrigatoriamente esses parametros tem que ser colodos logo após o "Cliente(cpf, rg); ?

Opa Xara!

Exatamente como a Vânia explicou acima, pra resolver esse problema, você pode criar um segundo construtor que não exige os parâmetros que você ta colocando, algo do tipo:

class Cliente
    {
        public string Nome { get; set; }
        public string Rg { get; set; }
        public string Endereco { get; set; }
        public string Cpf { get; set; }
        public int idade { get; set; }

        public Cliente (string rg, string cpf)
        {

            this.Rg = rg;
            this.Cpf = cpf;
        }

    public Cliente() { }  // Dessa forma assim!!

}

Você pode criar mais de um construtor para a mesma classe com parâmetros diferentes, nesse caso eu criei um construtor com nenhum parâmetro, e deve funcionar da forma que você quer.

Espero que ajude.

Opa, obigado pela resposta. Dessa forma realmente funciona, mas agora não entendi o seguinte: prq criar um classe com parametros padrões e uma com obrigatórios?

Isso ta dizendo para o código que eu posso tanto passar os comandos obrigatórios quanto não passar? Não seria então a mesma coisa que colocar um construtor padrão?

solução!

Bom, a questão da implementação ou não do construtor depende muito do que o desenvolvedor deseja daquela classe em questão.

Por exemplo: O construtor é uma forma de quem está escrevendo a classe de encapsular as informações logo de cara e impedir que uma classe seja instanciada sem alguns parâmetros chaves.

Ele pode fazer mais coisas dentro do construtor alem de setar parâmetros, como passar métodos para serem executados quando alguém instancia a classe, logo de cara.

coisas do tipo:

 public Cliente (string rg, string cpf)
        {

            this.Rg = rg;
            this.Cpf = cpf;

                metodoX();

                metodoY();
        }

Depende muito do que o desenvolvedor quer, mas existem muitas possibilidades, como passar construtores diferentes que fazem coisas diferentes na hora de instanciar a classe.

Entendi, muito obrigado aos dois pelo tempo e pelas respostas!