Questa è una domanda per principianti, ma mi interessa sapere cosa sta succedendo qui. La mia domanda è: cosa succede dietro le quinte quando lanci un oggetto? Mantiene una sorta di metadati su ciò che era in origine? Ecco cosa voglio dire:Quando un cast viene lanciato su una classe base, come ricorda cosa è realmente?
Supponiamo che io sono un metodo chiamato "clockin" che accetta un parametro di tipo "Dipendente":
public static void ClockIn(Employee employee)
{
var manager = employee as Manager;
if (manager != null)
{
manager.OpenSafe();
}
}
Quindi, assumere che Manager è una sottoclasse del tipo Employee e che ha il metodo "OpenSafe":
public class Manager : Employee
{
public void OpenSafe()
{
...
}
}
il metodo "clockin", se rileva che un manager è stato passato in, chiama il metodo OpenSafe. Come ad esempio:
var bob = new Manager();
ClockIn(bob);
Qui, ho passato in un'istanza di tipo manager in un metodo che accetta il Dipendente classe di base. Ho bisogno di lanciare l'istanza all'interno del metodo ClockIn su Manager prima di poter chiamare OpenSafe.
La domanda è, c'è qualche metadati che ricorda che "Bob" è un manager, anche se l'ho passato come un impiegato? Come fa il codice a sapere che può essere effettivamente assegnato a un manager? C'è qualcosa che sta succedendo nel mucchio?
Questa non è una domanda per principianti. Scommetto che la maggior parte dei professionisti (> almeno il 95%) non lo sanno. È anche una ** ottima domanda **. –