Quando uma classe deriva de outra, ela herda todos os membros, até aqueles marcados com private
na classe base e que, portanto, não são diretamente acessíveis na classe derivada.
Vamos pensar em uma situação mais simples:
class Funcionario
{
private string _cpf;
public void DefinirCPF(string novoCPF)
{
_cpf = novoCPF;
}
}
Aqui, a classe Funcionario
define o membro privado _cpf
e, só pra reforçar, sabemos que o código abaixo não compila:
Funcionario func = new Funcionario();
func._cpf = "342.545.235-39";
Porque _cpf
é acessível somente dentro da classe Funcionario
. Mas, esta classe possui o método DefinirCPF
que é público e, portanto, acessível fora da classe Funcionario
.
Agora, vamos usar um caso de herança:
class Diretor : Funcionario
{
}
A classe Diretor
possui o membro _cpf
também! Mas, este é inacessível, então o código com construtor abaixo não compila:
class Diretor : Funcionario
{
public Diretor()
{
_cpf = "342.545.235-39";
}
}
Contudo, a classe Diretor
também possui o método público DefinirCPF
. Então realizar uma chamada a este método é permitido:
class Diretor : Funcionario
{
public Diretor()
{
DefinirCPF("342.545.235-39");
}
}
A implementação de DefinirCPF
foi definida na classe base Funcionario
. Do ponto de vista do Diretor
, a implementação na classe base não importa. O importante é que este é um método público que pode ser invocado. Assim como no exemplo abaixo:
static void Main(string[] args)
{
Funcionario func = new Funcionario();
func.DefinirCPF("342.545.235-39");
}
A implementação em DefinirCPF
é omitida do método Main
e a classe Program
não precisa ter acesso aos membros que este método usa, pois isto é responsabilidade de Funcionario
.
Aqui, acontece a mesma coisa:
public Diretor()
{
DefinirCPF("342.545.235-39");
}
Beleza? O que você acha disto até agora?
Agora, vamos remover o método DefinirCPF
da classe Funcionario
e colocar este código dentro do construtor:
class Funcionario
{
private string _cpf;
public Funcionario(string cpf)
{
_cpf = cpf;
}
}
Agora, só podemos criar uma instância de Funcionario
preenchendo este argumento e as classes derivadas precisam preencher este argumento também, através da palavra reservada base
no construtor:
class Diretor : Funcionario
{
public Diretor() : base("342.545.235-39")
{
}
}
E aqui, novamente, não escrevemos nenhum código na classe Diretor
que acessa o campo privado _cpf
e define a ele um valor. Quem faz isto é o construtor definido em Funcionario
.
As regras que vimos acima com chamadas de métodos valem aqui também! A implementação deste construtor é omitida a classe derivada Diretor
, somente a classe Funcionario
a conhece e, portanto, pode acessar seus membros privados.
O que você acha? Se você continuar com dúvida, poderia dar um exemplo de código e pontuar as linhas que te trazem dúvidas sobre o comportamento ou o que não deveria compilar?
Ficamos no aguardo. Abs.