Ho il seguente codice.Perché assegniamo l'oggetto classe figlio alla variabile di riferimento della classe genitore?
public class Parent
{
public void Print()
{
Console.WriteLine ("Parent Method");
}
}
public class Child : Parent
{
public new void Print()
{
Console.WriteLine ("Child Method");
}
}
public class Program
{
public static void Main()
{
Child C = new Child();
C.Print();
}
}
Se corro questo codice, ottengo il risultato "Metodo Child" Ma se lo faccio quanto segue, perché ottengo il risultato "Metodo Parent"?
public class Parent
{
public void Print()
{
Console.WriteLine ("Parent Method");
}
}
public class Child : Parent
{
public new void Print()
{
Console.WriteLine ("Child Method");
}
}
public class Program
{
public static void Main()
{
Parent P = new Child(); // The only difference is this.
P.Print();
}
}
L'unica differenza è la seguente
Child C = new Child();
Parent P = new Child();
ho pensato new Child()
significa che creiamo l'istanza di Child
di classe. E ho pensato entrambi, C
e P
, sono solo variabili di riferimento oggetto che contengono la posizione dell'istanza della classe Child
.
Puoi correggermi se ho torto o dimmi se mi manca qualcosa perché non capisco perché nei casi sopra riportati ottengo risultati diversi?
Poiché si sta nascondendo i metodi, non li override. Quando scrivi P.Print, il compilatore può solo chiamare il metodo di stampa dei genitori, non il metodo figlio nascosto. –
Possibile duplicato: http://stackoverflow.com/questions/17717570/why-does-calling-a-method-in-my-derived-class-call-the-base-class-method –
Come consiglio a parte, raccomando evitando di nascondere il metodo a meno che non ne abbiate legittimamente bisogno. Tende a rendere il codice più difficile da mantenere. Citando [Method Hiding Apologia] di Eric Lippert (http://blogs.msdn.com/b/ericlippert/archive/2008/05/21/method-hiding-apologia.aspx), "Sembra che i tipi derivati sembrino interrompere i contratti dei tipi di base Se un tipo derivato D nasconde un metodo M sulla classe base B perché DM fa qualcosa di diverso da BM, non dovrebbe avere un nome diverso? " – Brian