Polimorfismo y distribución dinámica
Comprenda el polimorfismo: llame a miembros virtuales mediante una referencia base, use colecciones tipadas como la base, evite ocultar métodos y haga casting de forma segura cuando sea necesario.
Polimorfismo y distribución dinámica es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 3 de 3. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C# Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C# Academy incluye 3 lecciones en total.
Descripción general del polimorfismo
Objetivo: use un tipo base y permita que los tipos derivados personalicen el comportamiento.
- Referencia base, objeto derivado
- virtual + override → despacho dinámico
- Colecciones tipadas como la clase base
- Evite ocultar métodos con new
Conceptos básicos del despacho dinámico
Al llamar a un método virtual, se usa el tipo de runtime del objeto, no el tipo de la variable en tiempo de compilación.
using System;
public class Animal
{
public virtual string Speak() { return "???"; }
}
public class Cat : Animal
{
public override string Speak() { return "Meow"; }
}
public class Dog : Animal
{
public override string Speak() { return "Woof"; }
}
public class Program
{
public static void Main(string[] args)
{
Animal a1 = new Cat(); // base reference
Animal a2 = new Dog();
Console.WriteLine(a1.Speak()); // Meow
Console.WriteLine(a2.Speak()); // Woof
}
}
Polimorfismo en colecciones
Almacene distintos tipos derivados en una List<Base> y llame a los miembros virtuales de forma uniforme.
using System;
using System.Collections.Generic;
public class Shape
{
public virtual double Area() { return 0.0; }
}
public class Rectangle : Shape
{
private readonly int _w, _h;
public Rectangle(int w, int h) { _w = w; _h = h; }
public override double Area() { return _w * _h; }
}
public class Circle : Shape
{
private readonly int _r;
public Circle(int r) { _r = r; }
public override double Area() { return 3.14159 * _r * _r; }
}
public class Program
{
public static void Main(string[] args)
{
List<Shape> shapes = new List<Shape>();
shapes.Add(new Rectangle(3, 4));
shapes.Add(new Circle(2));
foreach (Shape s in shapes)
{
Console.WriteLine("Area = " + s.Area()); // calls correct override
}
}
}
Ocultación frente a sobrescritura
Evite la ocultación de métodos (new). Use override para obtener polimorfismo real; la ocultación llama a la versión de la clase base mediante una referencia a la clase base.
using System;
public class Printer
{
public virtual void Print() { Console.WriteLine("[Base]"); }
}
public class LoudPrinter : Printer
{
public override void Print() { Console.WriteLine("[LOUD]"); }
}
public class HiddenPrinter : Printer
{
// Hides the base method instead of overriding (BAD fit for polymorphism)
public new void Print() { Console.WriteLine("[HIDDEN]"); }
}
public class Program
{
public static void Main(string[] args)
{
Printer a = new LoudPrinter();
Printer b = new HiddenPrinter();
a.Print(); // [LOUD] (override works)
b.Print(); // [Base] (hiding fails via base reference)
}
}
Conversión segura (as y comprobación)
Prefiera las llamadas a la clase base o virtuales. Si debe usar miembros exclusivos del tipo derivado, haga una conversión segura (as + comprobación de null).
using System;
public class Vehicle
{
public virtual string Info() { return "Vehicle"; }
}
public class Car : Vehicle
{
public bool HasAirConditioning;
public override string Info() { return "Car"; }
}
public class Program
{
public static void Main(string[] args)
{
Vehicle v = new Car();
Console.WriteLine(v.Info()); // polymorphic call
// Need a Car-only member? Cast carefully using 'as'
Car c = v as Car;
if (c != null)
{
c.HasAirConditioning = true;
Console.WriteLine("AC set: " + c.HasAirConditioning);
}
else
{
Console.WriteLine("Not a Car");
}
}
}
Consejos sobre polimorfismo
Consejos:
- Diseñe primero pensando en llamadas a la clase base o virtuales.
- Use override, no new, para cambiar el comportamiento.
- Mantenga las API base pequeñas y estables.
- Haga conversiones pocas veces; prefiera el polimorfismo o las interfaces.
Significado del despacho dinámico
Repaso
Repaso: el polimorfismo permite que una llamada a la clase base alcance muchos comportamientos derivados mediante virtual/override. Use colecciones tipadas como la clase base, evite la ocultación con new y haga conversiones solo cuando sea necesario.
Preguntas frecuentes
¿La lección «Polimorfismo y distribución dinámica» es gratis?
Sí — el texto completo de «Polimorfismo y distribución dinámica» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C# Academy, actualiza a CoddyKit PRO. El curso de C# Academy incluye 3 lecciones en total.
¿Qué aprenderé en «Polimorfismo y distribución dinámica»?
Comprenda el polimorfismo: llame a miembros virtuales mediante una referencia base, use colecciones tipadas como la base, evite ocultar métodos y haga casting de forma segura cuando sea necesario. Practicas C# Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C# Academy?
No se requiere experiencia previa. C# Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 3.
¿Cuánto tiempo toma la lección «Polimorfismo y distribución dinámica»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C# Academy?
Sí. Cada lección de C# Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- virtual/override/sealed y clases abstractas
- Interfaces (introducción) e implementación de varias interfaces
- Polimorfismo y distribución dinámica