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

Como fica o CPF deDiretor

Tenho uma dúvida. Considerando o código abaixo

public Diretor (string cpf) : base (cpf)

No exemplo, o corpo do construtor de Diretor não faz uma atribuição do tipo CPF = cpf. Portanto, na criação de um objeto Diretor, creio que este não terá nenhum valor atribuído ao CPF. Esse tipo de assinatura (código acima) serve apenas para no momento da instanciação, o construtor de Funcionario ter o argumento cpf, que é obrigatório?

3 respostas

Aproveitando, quem chama o construtor da classe base? Num primeiro momento achei que era a máquina virtual, depois achei que era o construtor da classe derivada.

solução!

Olá, Rodrigo. Tudo bom com você?

Quando uma classe possui o construtor com argumentos. é obrigatório preencher estes argumentos no momento da instanciação (a não ser que você tenha outra sobrecarga de construtor sem argumentos):

class Teste
{
    public Teste(string argumento)
    {
        Console.WriteLine(argumento);
    }
}

Se é obrigatório preencher este argumento para instanciar um objeto deste tipo, quando derivamos do tipo Teste a classe derivada será obrigada a preencher o valor do construtor da classe base:

class Derivado : Teste 
{
    public Derivado() : base("lorem ipsum")
    {
    }
}

Com esse exemplo que eu dei, a instanciação da classe do tipo Derivado executará os construtores nesta ordem:

  • Construtor de Teste passando o argumento "lorem ipsum"
  • Construtor de Derivado

Uma coisa que podemos fazer é ter um argumento no construtor do tipo Derivado e passar ele diretamente para o construtor da classe base:

public Derivado(string outroArgumento) : base(outroArgumento)
{
}

E a ordem de execução se mantém a mesma. No caso do Funcionario e Diretor, não precisamos repetir a atribuição da propriedade CPF no construtor de Diretor, uma vez que o construtor da classe base já faz isto para nós! E, como o construtor da classe base é sempre executado primeiro, no construtor da classe derivada podemos usar os membros definidos na classe base com segurança, afinal, o construtor já inicializou os membros.

Agora, quem é que executa esse código da classe base? Ótima pergunta!

Note que o C# é uma linguagem compilada para outra linguagem. A linguagem intermediária MSIL.

No construtor de uma classe base, o compilador do C# gera um MSIL que faz a chamada para o código do construtor da classe base. Em pseudo-C# seria algo como:

public Derivado(string outroArgumento)
{
    construtorDaClasseBase(outroArgumento);
}

Em detalhes, a restrição de preencher os argumentos da classe base vem do C# e não do MSIL ou da máquina virtual.

Beleza? O que você acha? Resolvi sua dúvida?

Abs.

Entendido, Guilherme. Valeu!