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"
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.