Hubiese sido bueno el tema de upcasting y downcasting, aqui les dejo info para que investiguen un poco mas del tema.
Creo esta entendible => https://www.c-sharpcorner.com/article/polymorphism-up-casting-and-down-casting/
Domina el polimorfismo en C# con ejemplos claros en Visual Studio Code. Entiende cómo un Alumno se ve como ObjetoEscuela gracias a la herencia, cuándo un padre puede verse como su hijo mediante casting y qué ocurre si fuerzas conversiones que el compilador acepta pero fallan en runtime. Evita errores comunes y aprovecha este pilar de la programación orientada a objetos.
¿Qué es polimorfismo y por qué importa en C#?
El polimorfismo permite tratar objetos de clases hijas como instancias de su clase padre. Un Alumno es un ObjetoEscuela porque hereda de él. También es posible intentar el camino inverso: ver el padre como su hijo, pero solo si el objeto realmente es del tipo del hijo. De lo contrario, el casting compila, pero falla en tiempo de ejecución.
¿Cómo se ve un alumno como objeto escuela?
// Alumno hereda de ObjetoEscuela Alumno alumno = new Alumno(); ObjetoEscuela ob = alumno; // upcasting seguro // Válido si ob realmente contiene un Alumno Alumno alumnoDeNuevo = (Alumno)ob; // downcasting correcto solo si ob es Alumno
¿Cuándo un padre puede verse como su hijo?
ObjetoEscuela dummy = new ObjetoEscuela(); // Compila al forzar, pero fallará en runtime porque dummy no es Alumno Alumno alumnoInvalido = (Alumno)dummy; // incorrecto
¿Cómo modelar evaluación y asignación de tipos sin errores?
Una Evaluación también es un ObjetoEscuela. Puedes crearla, asignar atributos clave y tratarla como su clase base. No puedes acceder a propiedades específicas (como Nota) desde la referencia de tipo base.
¿Cómo crear una evaluación y establecer atributos clave?
var evaluacion = new Evaluacion { Nombre = "Evaluación de matemáticas", Nota = 4.5f // Asignatura = new Asignatura { Nombre = "Matemáticas" }; // requiere instancia; se omitió en el ejemplo };
¿Cómo asignar evaluación a un objeto base y qué limitaciones hay?
ObjetoEscuela obEval = evaluacion; // upcasting válido float notaOk = evaluacion.Nota; // válido // float notaError = obEval.Nota; // no existe Nota en ObjetoEscuela
¿Qué pasa al convertir evaluación en alumno?
Evaluación y Alumno comparten padre (ObjetoEscuela), pero no son compatibles entre sí.
Evaluacion evaluacion2 = new Evaluacion(); // No permitido: tipos distintos entre sí // Alumno a = (Alumno)evaluacion2; // error de compilación // Engaña al compilador, no al runtime ObjetoEscuela baseOb = evaluacion2; // upcasting Alumno aForzado = (Alumno)baseOb; // compila, pero fallará en ejecución
¿Qué prácticas seguras aplicar con polimorfismo y casts?
El polimorfismo es potente, pero un casting incorrecto rompe la ejecución. La clave es operar según el tipo real del objeto y no asumir compatibilidades que no existen entre clases hermanas.
¿Cuándo confiar en el compilador y cuándo validar?
¿Qué idea clave recordar sobre evaluación y alumno?
¿Qué se construirá después con objeto escuela?
Se plantea una funcionalidad para que la escuela entregue todos sus objetos de tipo ObjetoEscuela. Servirá para explotar el polimorfismo de forma ordenada y segura.
¿Tienes dudas o un ejemplo propio con casting y herencia en C#? Compártelo y conversemos cómo mejorarlo.
Domina el polimorfismo en C# con ejemplos claros en Visual Studio Code. Entiende cómo un Alumno se ve como ObjetoEscuela gracias a la herencia, cuándo un padre puede verse como su hijo mediante casting y qué ocurre si fuerzas conversiones que el compilador acepta pero fallan en runtime. Evita errores comunes y aprovecha este pilar de la programación orientada a objetos.
El polimorfismo permite tratar objetos de clases hijas como instancias de su clase padre. Un Alumno es un ObjetoEscuela porque hereda de él. También es posible intentar el camino inverso: ver el padre como su hijo, pero solo si el objeto realmente es del tipo del hijo. De lo contrario, el casting compila, pero falla en tiempo de ejecución.
// Alumno hereda de ObjetoEscuela
Alumno alumno = new Alumno();
ObjetoEscuela ob = alumno; // upcasting seguro
// Válido si ob realmente contiene un Alumno
Alumno alumnoDeNuevo = (Alumno)ob; // downcasting correcto solo si ob es Alumno
ObjetoEscuela dummy = new ObjetoEscuela();
// Compila al forzar, pero fallará en runtime porque dummy no es Alumno
Alumno alumnoInvalido = (Alumno)dummy; // incorrecto
Una Evaluación también es un ObjetoEscuela. Puedes crearla, asignar atributos clave y tratarla como su clase base. No puedes acceder a propiedades específicas (como Nota) desde la referencia de tipo base.
var evaluacion = new Evaluacion {
Nombre = "Evaluación de matemáticas",
Nota = 4.5f
// Asignatura = new Asignatura { Nombre = "Matemáticas" }; // requiere instancia; se omitió en el ejemplo
};
ObjetoEscuela obEval = evaluacion; // upcasting válido
float notaOk = evaluacion.Nota; // válido
// float notaError = obEval.Nota; // no existe Nota en ObjetoEscuela
Evaluación y Alumno comparten padre (ObjetoEscuela), pero no son compatibles entre sí.
Evaluacion evaluacion2 = new Evaluacion();
// No permitido: tipos distintos entre sí
// Alumno a = (Alumno)evaluacion2; // error de compilación
// Engaña al compilador, no al runtime
ObjetoEscuela baseOb = evaluacion2; // upcasting
Alumno aForzado = (Alumno)baseOb; // compila, pero fallará en ejecución
El polimorfismo es potente, pero un casting incorrecto rompe la ejecución. La clave es operar según el tipo real del objeto y no asumir compatibilidades que no existen entre clases hermanas.
Se plantea una funcionalidad para que la escuela entregue todos sus objetos de tipo ObjetoEscuela. Servirá para explotar el polimorfismo de forma ordenada y segura.
¿Tienes dudas o un ejemplo propio con casting y herencia en C#? Compártelo y conversemos cómo mejorarlo.
Hubiese sido bueno el tema de upcasting y downcasting, aqui les dejo info para que investiguen un poco mas del tema.
Creo esta entendible => https://www.c-sharpcorner.com/article/polymorphism-up-casting-and-down-casting/
El polimorfismo permite que un método de la clase PADRE se herede a la clase hija pero que al mismo tiempo, la clase hija pueda cambiar el comportamiento de dicho método heredado. Estoy en lo correcto?
Por ejemplo, si tengo una CLASE PADRE que es "Perro" con el método ladrar() y las CLASES HIJAS "Chihuahua" y "Pastor Alemán". En este caso, ambas heredan el metodo ladrar(), sin embargo, lo hacen de manera diferente en cada caso ya que el Chihuahua no ladra igual que el Pastor Alemán. También, las clases hijas "Chihuahua" y "Pastor Alemán" pueden ser tratados como la clase padre "Perro" (porque son perros), pero la clase "Perro" no puede ser tratado como "Chihuahua", ni "Pastor Alemán". Mi ejemplo es bueno??
En mi opinión personal me parece un pésimo ejemplo hablar de problemas de polimorfismo al querer castear objetos de diferentes clases, ese problema puede existir sin necesidad del polimorfismo y en realidad es una practica muy mala q solo se debe en usar en casos muy pero muy específicos.
¿Por que usar el polimorfismo? ¿Por que no simplemente usar la clase alumno en vez de utilizar el objeto de la clase padre?
no engañen a su sistema :v
En pocas palabras no podemos transformar a un objeto hijo a un objeto de tipo padre ya que si bien el primero hereda, no significa que haga referencia absoluta al padre.
Printer.WriteTitle("Pruebas de Polifomrfismo");
var alumnoTest = new Alumno { Nombre = "Claire UnderWood" };
Printer.WriteTitle("AlumnoTest");
WriteLine($"Alumno: {alumnoTest.Nombre}");
WriteLine($"Alumno: {alumnoTest.UniqueId}");
WriteLine($"Alumno: {alumnoTest.GetType()}");
ObjetoEscuelaBase ob = alumnoTest;
Printer.WriteTitle("ObjetoEscuelaBase");
WriteLine($"Alumno: {ob.Nombre}");
WriteLine($"Alumno: {ob.UniqueId}");
WriteLine($"Alumno: {ob.GetType()}");
var objDummy = new ObjetoEscuelaBase() { Nombre = "Frank Underwood" };
Printer.WriteTitle("bjDummy");
WriteLine($"Alumno: {objDummy.Nombre}");
WriteLine($"Alumno: {objDummy.UniqueId}");
WriteLine($"Alumno: {objDummy.GetType()}");
alumnoTest = (Alumno) ob;
Printer.WriteTitle("AlumnoTest");
WriteLine($"Alumno: {alumnoTest.Nombre}");
WriteLine($"Alumno: {alumnoTest.UniqueId}");
WriteLine($"Alumno: {alumnoTest.GetType()}");
//GENERA ERROR EN TIEMPO DE EJECUCIÓN
/* alumnoTest = (Alumno) objDummy;
Printer.WriteTitle("AlumnoTest");
WriteLine($"Alumno: {alumnoTest.Nombre}");
WriteLine($"Alumno: {alumnoTest.UniqueId}");
WriteLine($"Alumno: {alumnoTest.GetType()}"); */
var evaluacion = new Evaluacion(){Nombre = "Evaluacion 1", Nota=4.5f};
Printer.WriteTitle("evaluacion");
WriteLine($"Alumno: {evaluacion.Nombre}");
WriteLine($"Alumno: {evaluacion.UniqueId}");
WriteLine($"Alumno: {evaluacion.Nota}");
WriteLine($"Alumno: {alumnoTest.GetType()}");
ob = evaluacion;
Printer.WriteTitle("ObjetoEscuelaBase evaluacion");
WriteLine($"Alumno: {ob.Nombre}");
WriteLine($"Alumno: {ob.UniqueId}");
WriteLine($"Alumno: {ob.GetType()}");
// GENERA ERROR EN TIEMPO DE EJECUCIÓN
// alumnoTest = (Alumno)(ObjetoEscuelaBase)evaluacion;
En mi caso como programador he visto que el riesgo que se utiliza cuando se hace poliformismo es la concurrencia para modificar los objetos ya que se puede deformar,
Alguno conoce que problema mas causa el poliformismo?
Osea el polimorfismo esla forma de ver un objeto como el objeto padre, siempre cuando compartan atributos???
Interesante