Polimorfismo en Programación Orientada a Objetos
Clase 4 de 35 • Curso de C# con .Net Core 2.1
Contenido del curso
Etapa 5 – POO reutilicemos nuestro código
- 2

Herencia para reutilizar código C#
10:30 min - 3

Herencia y Polimorfismo en Programación Orientada a Objetos
11:42 min - 4

Polimorfismo en Programación Orientada a Objetos
Viendo ahora - 5

Casting en C#: cuándo funciona y cuándo falla
07:09 min - 6

Conversiones seguras en C# con is y as
12:44 min - 7

Sobrescribir ToString para depuración en C#
08:15 min
Etapa 6- Ajustes y funcionalidad
Etapa 7 – Preparando información para nuestros reportes
- 11

Manejo Avanzado de Métodos y Parámetros en Programación
15:43 min - 12

Manejo de Parámetros de Salida en Visual Studio Code
04:38 min - 13

Sobrecarga de Métodos para Parámetros de Salida Opcionales
05:51 min - 14

Optimización de Listas: Buenas Prácticas en C#
04:16 min - 15

Dictionary: cómo funciona en C#
11:14 min - 16

Diccionarios con polimorfismo en C#
10:48 min - 17

Uso de Constantes y Enumeraciones para Optimizar Diccionarios en C#
11:33 min - 18

Foreach anidado para diccionarios en C#
13:47 min - 19

Depuración de diccionarios en C#
09:37 min - 20

Parámetro opcional para controlar impresión en C#
11:47 min - 21

Cómo usar switch en lugar de if/else
14:30 min - 22

Números aleatorios y eventos en C#
12:52 min - 23

Diccionarios y Refactoring en Programación Básica
02:13 min
Etapa 8 – Consultas
- 24

Cómo crear un reporteador en C sharp
11:42 min - 25

Generación segura de reportes en sistemas de información
10:21 min - 26

Construcción de reportes con LINQ en C#
11:48 min - 27

Diccionario con evaluaciones por asignatura
08:32 min - 28

Tipos anónimos en LINQ para reportes complejos
10:52 min - 29

Cálculo del Promedio de Notas Agrupadas por Alumno y Asignatura
10:46 min - 30

Creación de Tipos de Datos Personalizados en Programación Avanzada
12:05 min - 31

Generación de Reportes con LINQ en C#
02:09 min
Etapa 9 – Creando una UI de Consola
El polimorfismo en C# cobra sentido cuando ves un mismo objeto desde distintas referencias. Aquí se demuestra con claridad cómo un Alumno, que hereda de ObjetoEscuela, puede tratarse uniformemente como su padre, cómo imprimir sus datos y qué ocurre al convertir referencias entre padre e hijo. Sin teorías extra: solo código, resultados y buenas prácticas.
¿Qué es polimorfismo y cómo verlo en código?
El punto de partida es simple y potente: una instancia de Alumno se puede ver como ObjetoEscuela porque hereda de esa clase. Así, accedemos a atributos comunes como nombre e ID único, y comprobamos que es el mismo objeto al coincidir los valores.
// Crear Alumno y asignarlo a variable de tipo base
var alumnoTest = new Alumno { Nombre = "Claire Underwood" };
ObjetoEscuelaBase ob = alumnoTest; // Polimorfismo: hijo visto como padre.
// Imprimir datos compartidos
Console.WriteLine($"Alumno: {alumnoTest.Nombre}, ID: {alumnoTest.UniqueId}.");
Console.WriteLine($"Objeto escuela: {ob.Nombre}, ID: {ob.UniqueId}.");
¿Por qué el tipo sigue siendo alumno?
Aunque uses una referencia de tipo padre, el tipo real del objeto no cambia: es Alumno. Por eso, al consultar el tipo, en ambos casos aparece Alumno. Esto valida que polimorfismo significa múltiples formas de ver la misma instancia, no duplicarla.
- Un Alumno hereda de ObjetoEscuela.
- La referencia base accede solo a miembros comunes.
- El ID único igual en ambas impresiones confirma que es la misma instancia.
¿Cómo afectan las conversiones y el casting al trabajar con herencia?
La compatibilidad es unidireccional: puedes ver al hijo como padre, pero no al padre como hijo, salvo que el objeto padre realmente contenga un hijo.
¿Cuándo es válido convertir de padre a hijo?
Cuando la referencia base apunta a un Alumno, la conversión explícita es válida y segura.
// Referencia base que realmente contiene un Alumno
ObjetoEscuelaBase ob = alumnoTest;
var alumnoOtraVez = (Alumno)ob; // Cast válido porque ob es un Alumno.
Console.WriteLine($"Alumno otra vez: {alumnoOtraVez.Nombre}, ID: {alumnoOtraVez.UniqueId}.");
¿Cuándo falla y lanza excepción?
Si instancias un ObjetoEscuelaBase “puro” (para la demostración se quitó temporalmente la palabra abstract), forzar un cast a Alumno lanza excepción: ese objeto padre no tiene las características del hijo.
// Objeto de la clase base (tras quitar *abstract* para la prueba)
var dummy = new ObjetoEscuelaBase { Nombre = "Frank Underwood" };
// Cast inválido: este objeto nunca fue un Alumno
var alumnoInvalido = (Alumno)dummy; // Lanza excepción en tiempo de ejecución.
- La conversión de padre a hijo solo procede si el contenido es realmente del tipo hijo.
- Un cast forzado sobre un objeto base que no es un Alumno provoca error.
- La referencia no cambia el objeto: solo cómo lo ves y qué miembros puedes usar.
¿Qué prácticas y herramientas se aplican durante el ejercicio?
Además del concepto, se usaron herramientas y técnicas que potencian el flujo de trabajo y la legibilidad.
- Renombrar método con refactoring en Visual Studio: clic derecho, renombrar symbol.
- Mantener consistencia de nombres: cambiar a DrawLine en la clase printer.
- Impresión con interpolación de cadenas:
$"texto {variable}"para mostrar nombre e ID. - Ejecución constante para validar resultados: dotnet run y observar la salida.
- Conceptos practicados: herencia, polimorfismo, compatibilidad de tipos, clase base, clase hija, ID único, conversión explícita (casting), excepción por cast inválido, clase abstract y tipo en tiempo de ejecución.
¿Te gustaría que mostremos cómo detectar de forma segura el tipo antes de castear o integrar estas pruebas con tu printer? Comparte tus dudas y casos prácticos en los comentarios.