Quando um objeto é convertido para uma classe base, como ele se lembra do que realmente é?
Esta é uma pergunta para iniciantes, mas estou interessado em aprender o que está acontecendo aqui. Minha pergunta é: o que acontece nos bastidores quando você rebaixa um objeto? Ele mantém algum tipo de metadado sobre o que era originalmente? Aqui está o que eu quero dizer:
Suponha que eu tenha um método chamado "ClockIn" que aceite um parâmetro do tipo "Employee":
public static void ClockIn(Employee employee)
{
var manager = employee as Manager;
if (manager != null)
{
manager.OpenSafe();
}
}
Portanto, suponha que o gerente seja uma subclasse do tipo Employee e que tenha o método "OpenSafe":
public class Manager : Employee
{
public void OpenSafe()
{
...
}
}
O método "ClockIn", se achar que um gerente foi passado, chama o método OpenSafe. Tal como:
var bob = new Manager();
ClockIn(bob);
Aqui, eu passei uma instância do tipo Manager para um método que aceita a classe base Employee. Preciso converter a instância dentro do método ClockIn para o Manager antes de poder chamar o OpenSafe.
A questão é: existem alguns metadados que lembram que "bob" é um gerente, mesmo que eu tenha passado por ele como funcionário? Como o código sabe que ele pode realmente ser transmitido a um gerente? Há algo acontecendo na pilha?