Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

267
Vistas
¿Por qué asignamos el objeto de la clase secundaria a la variable de referencia de la clase principal?

tengo el siguiente código.

 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(); } }

Si ejecuto este código, obtengo el resultado "Método secundario" Pero si hago lo siguiente, ¿por qué obtengo el resultado "Método principal"?

 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(); } }

La única diferencia es la siguiente

 Child C = new Child(); Parent P = new Child();

Pensé que new Child() significa que creamos la instancia de la clase Child . Y pensé que tanto C como P son solo variables de referencia de objetos que contienen la ubicación de la instancia de la clase Child .
¿Pueden corregirme si me equivoco o decirme si me equivoco en algo porque no entiendo por qué en los casos anteriores obtengo resultados diferentes?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Es porque ha vuelto a declarar el método Print en Child . Entonces, en el momento de la compilación, P.Print() se resuelve en Parent.Print , pero C.Print() se resuelve en Child.Print() . Si tuviera un método virtual que se anuló en Child , ambos imprimirían "Método Child":

 public class Parent { // Declare this as virtual, allowing it to be overridden in // derived classes. The implementation will depend on the // execution-time type of the object it's called on. public virtual void Print() { Console.WriteLine ("Parent Method"); } } public class Child : Parent { // Override Parent.Print, so if Print is called on a reference // with compile-time type of Parent, but at execution it // refers to a Child, this implementation will be executed. public override void Print() { Console.WriteLine ("Child Method"); } }

Relacionada:

  • ¿Cuál es la diferencia entre override y new ? (Entrada de preguntas frecuentes de C# en MSDN: resultó haber sido escrita por mí, ¡pero lo había olvidado!)
  • Saber cuándo usar la override y las new palabras clave (MSDN)
over 4 years ago · Santiago Trujillo Denunciar

0

Esto es lo que sucede debajo del capó

 Child C = new Child(); C.Print();

Porque estás ocultando métodos, no anulándolos. por lo tanto, el método Print en Parent está oculto y se invoca Child.Print().

ingrese la descripción de la imagen aquí

 Parent P = new Child(); // The only difference is this. P.Print();

Este (New Child()) se llamará en una referencia de tipo principal.

ingrese la descripción de la imagen aquí

si prueba este, la referencia de tipo principal se convertirá en tipo secundario. De ahora en adelante se invoca a Child.Print().

 Parent P = new Child(); ((Child)P).Print();

ingrese la descripción de la imagen aquí

la salida será: Método hijo

over 4 years ago · Santiago Trujillo Denunciar

0

Dado que el método Print no es virtual , el compilador no emitirá código para decirle a CLR que invoque el método de acuerdo con el tipo de tiempo de ejecución real.

Entonces, cuando se haga referencia a su variable como Child , se Child.Print . Pero, cuando se refiere a él como Parent , se Parent.Print .

El uso de la new palabra clave aquí solo está destinado a ocultar , para decirle al compilador que el método secundario está ocultando el método principal y no lo anula, pero no tiene ningún efecto.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda