« Voltar
em .net c#

Chamando outro construtor dentro da mesma classe.

Vamos supor que temos a seguinte classe:

public class Usuario  
{
    public int Id { get; set; }

    public string Nome { get; set; }

    public string Senha { get; set; }

    public string Endereco { get; set; }

    public int Matricula { get; set; }
}

E queremos que, toda vez que alguém vá criar uma instância de Usuario, essa pessoa seja obrigada a passar um Id e Nome.
Podemos fazer isso adicionando um construtor na classe, certo?

public class Usuario  
{
    public int Id { get; set; }

    public string Nome { get; set; }

    public string Senha { get; set; }

    public string Endereco { get; set; }

    public int Matricula { get; set; }

    public Usuario(int id, string nome)
    {
        this.Id = id;
        this.Nome = nome;
    }
}

Agora, e se eu quiser que Id e Nome continuem sendo obrigatórios e Endereco e Matricula possam ser passados opcionalmente?
Nesse caso, poderíamos criar um outro construtor:

public class Usuario  
{
    public int Id { get; set; }

    public string Nome { get; set; }

    public string Senha { get; set; }

    public string Endereco { get; set; }

    public int Matricula { get; set; }

    public Usuario(int id, string nome)
    {
        this.Id = id;
        this.Nome = nome;
    }
    public Usuario(int id, string nome, string endereco, int matricula)
    {
        this.Id = id;
        this.Nome = nome;
        this.Endereco = endereco;
        this.Matricula = matricula;
    }
}

Agora, veja que esse segundo construtor está fazendo a mesma coisa que o outro construtor faz(recebendo e atribuindo os valores de id e nome) e recebendo e atribuindo mais dois parâmetros.

Ao invés de repetir o que o outro construtor faz, poderíamos reaproveitar o que já existe. A síntaxe para fazer isso é um tanto quanto esquisita:

public class Usuario  
{
    public int Id { get; set; }

    public string Nome { get; set; }

    public string Senha { get; set; }

    public string Endereco { get; set; }

    public int Matricula { get; set; }

    public Usuario(int id, string nome)
    {
        this.Id = id;
        this.Nome = nome;
    }
    public Usuario(int id, string nome, string endereco, int matricula) : this(id, nome)
    {
        this.Endereco = endereco;
        this.Matricula = matricula;
    }
}

Repare no que mudou: adicionamos o ": this(id, nome)" na frente do segundo construtor e tiramos duas primeiras linhas dele.

O que estamos falando no código desse construtor é mais ou menos o seguinte: esse construtor recebe id, nome, endereco e matricula. Antes de executar o código dele, procure um outro construtor nessa classe que receba um parâmetro do tipo int(id) e outro do tipo string(nome). Passe o valor das variáveis id e nome para esse outro e execute o que tem dentro dele. Depois, continue a execução do construtor normalmente.

Confuso?

É como se estivéssemos chamando um método passando parâmetros. Mas um construtor não tem um nome, certo? Ele tem o nome da classe. Por isso usamos o this.

O código que fizemos aqui é bem simples e nem teria necessidade de chamar outro construtor assim.
Mas imagine que em um sistema de verdade você pode ter um código bem mais chato dentro do seu construtor e não quer ficar copiando e colando ele em todos construtores.

Essa é só mais uma facilidade que o C# te oferece (:


Quer ganhar 15% de desconto pra gastar na Casa do Código e ainda ficar em dia com as minhas postagem e outras promoções e sorteios legais? Assina minha newsletter: http://gabsferreira.com/newsletter/ (:

Se quiser, curta minha página no Face também! O endereço é https://www.facebook.com/devgabsferreira

comments powered by Disqus