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

O objeto terá quais métodos quando é explicitamente do tipo menos derivado

Considerando o código(usado neste capítulo):

Diretor roberta = new Diretor();
Funcinario robertaTeste = roberta;

Foi dito que robertaTeste terá a bonificação implementada em Funcionario, pois ela é explicitamente do tipo Funcionario. OK.

Agora, se fosse o caso do código a seguir:

Funcionario robertaTeste = new Diretor();

Se a classe DIretor tivesse além dos métodos herdados de Funcionario, outros métodos implementados, a referência robertaTeste teria apenas os métodos de Funcionario, ou também os métodos adicionais presentes em Diretor? Por que?

5 respostas
solução!

Olá, Rodrigo.

Com uma referência do tipo Funcionario é possível apenas usar os métodos/propriedades disponíveis em Funcionario.

Inclusive, imagine que somente a classe Diretor possui uma propriedade chamada TesteDiretor. O código abaixo não será compilado:

Funcionario roberta = new Diretor();
Console.WriteLine( roberta.TesteDiretor ); // Erro aqui

O que você acha?

Abs e bons estudos.

Olá, Rodrigo

Nesse caso, a variável robertaTeste só tem acesso aos membros (métodos, propriedades, etc.) disponíveis na classe Funcionario, que é o tipo da declaração da variável. Isso porque C# é uma linguagem de tipagem estática, então o compilador faz o binding dos métodos em tempo de compilação, e não em tempo de execução. Isto é, a verificação é feita sobre o tipo declarado (Funcionario) quando o programa compila, e não sobre o tipo atribuído (Diretor). Para que a verificação do membro seja feita só no tempo de execução, é preciso usar o recurso de tipagem dinâmica do C#, declarando a variável com dynamic em vez de Funcionario.

Olá Guilherme,

Em "Com uma referência do tipo Diretor é possível apenas usar os métodos/propriedades disponíveis em Diretor." Você quis dizer Funcionario ao invés de Diretor, não?

Entendi a sua explicação, mas permanece uma dúvida. Em que situação Funcionario robertaTeste = new Diretor() pode ser útil? Por que não instacia-la como Funcionario mesmo, uma vez que ela não poderá utilizar os métodos extras de Diretor?

Quando criamos variáveis locais, raramente faremos algo como TipoBase minhaVar = new TipoDerivado(); na grande maioria das vezes as variáveis locais serão criadas na forma mais intuitiva TipoDerivado minhaVar = new TipoDerivado(); mesmo.

Mas, em argumentos de método isso faz muito sentido. Então, no lugar de criarmos um método com a assinatura:

public void RegistrarBonificacao(Diretor funcionario) ...

Criaremos com a assinatura do tipo mais base que oferece o que nós precisamos:

public void RegistrarBonificacao(Funcionario funcionario) ...

(Sua correção sobre minha confusão com diretor/funcionario está correta. Obrigado, corrigi para outros alunos ou alunas lerem com a sua correção :D )

Dúvida respondida. Valeu, pessoal!