Herencia en C# con clase Antihéroe

Resumen

La herencia en C# permite que una clase hija reutilice propiedades y métodos de una clase padre con solo dos puntos : en su declaración. Aquí verás cómo crear una clase Antiheroe que hereda de Superheroe en un proyecto real, reutilizando código y agregando comportamientos propios como acciones fuera de la ley.

Si vienes siguiendo el proyecto de superhéroes, este paso conecta la teoría de inheritance con un caso práctico que sí se entiende: Wolverine.

Por qué un antihéroe es perfecto para enseñar herencia en C#

Un antihéroe comparte casi todo con un superhéroe: tiene poderes, identidad secreta, nombre y ciudad. La diferencia es que puede romper la ley para cumplir su misión. Esa relación encaja exacto con la lógica de herencia: reutilizas lo común y agregas lo distinto [00:24].

En lugar de duplicar propiedades como Nombre, IdentidadSecreta o Superpoderes, dejas que la clase hija las tome prestadas de la clase padre. Y aquí viene lo interesante: la clase Antiheroe puede quedar prácticamente vacía y aún así funcionar completa.

¿Qué es la herencia en C#? Es un mecanismo que permite a una clase hija recibir todas las propiedades y métodos de una clase padre usando : en su declaración, sin tener que reescribir el código.

Cómo creo una clase Antihéroe que herede de Superhéroe

Desde Visual Studio, agregas una nueva clase con clic derecho, Add y luego Class. La nombras Antiheroe y aplicas la herencia con dos puntos seguidos del nombre de la clase padre [02:00].

csharp public class Antiheroe : Superheroe { }

Con esa sola línea, Antiheroe ya tiene acceso a todas las propiedades públicas de Superheroe: Id, Nombre, IdentidadSecreta, Ciudad, PuedeVolar y Superpoderes. No necesitas declarar nada más para empezar a usarla.

Cómo instancio el objeto Wolverine usando la clase hija

En Program.cs creas el objeto igual que cualquier otro, asignando valores a las propiedades heredadas:

csharp var wolverine = new Antiheroe(); wolverine.Id = 5; wolverine.Nombre = "Wolverine"; wolverine.IdentidadSecreta = "Logan"; wolverine.PuedeVolar = false;

Luego defines sus poderes reutilizando la lógica de superpoderes que ya tenías para Superman, agregando regeneración y superfuerza a una lista llamada poderesWolverine y asignándola a wolverine.Superpoderes [04:30].

Cómo agrego métodos propios a la clase hija sin afectar la clase padre

La herencia no es solo copiar; también es extender. Para diferenciar al antihéroe, agregas un método que solo él puede ejecutar: una acción fuera de la ley. Este método vive únicamente en la clase hija y no aparece en Superheroe [06:45].

csharp public string RealizarAccionAntiheroe(string accion) { return $"El antiheroe {Nombre}, {IdentidadSecreta}, ha realizado: {accion}"; }

Fíjate en algo clave: dentro del método accedes a Nombre e IdentidadSecreta aunque no estén declaradas en Antiheroe. Eso pasa porque la clase hija ve esas propiedades como propias gracias a la herencia. Aquí también usas string interpolation con el símbolo $ para concatenar texto y variables de forma limpia.

¿Puedo usar un método de la clase hija desde la clase padre? No. La clase padre no conoce los miembros que agregas en la hija. Solo el flujo va de padre a hija, nunca al revés.

Cómo invoco el método desde Program

Llamas el método sobre el objeto wolverine y pasas la acción como parámetro:

csharp var accionAntiheroe = wolverine.RealizarAccionAntiheroe("atacar a la policía"); Console.WriteLine(accionAntiheroe);

Al ejecutar, la consola imprime que Logan atacó a la policía, algo que un superhéroe tradicional jamás haría. Ese contraste es justo lo que la herencia te permite modelar: comportamiento compartido más comportamiento particular [08:30].

Qué conceptos de programación orientada a objetos aplicaste aquí

En este ejercicio pusiste en práctica varias ideas centrales de POO en C#:

  • Herencia simple: usar : para que Antiheroe extienda Superheroe y reutilice su código.
  • Reutilización de propiedades: acceder a Nombre, IdentidadSecreta y Superpoderes sin redeclararlas.
  • Extensión de la clase hija: agregar métodos propios como RealizarAccionAntiheroe que solo existen en la subclase.
  • String interpolation: construir strings dinámicos con $"...{variable}..." para retornar mensajes legibles.
  • Instanciación con new: crear objetos de la clase hija que tienen acceso completo al contrato del padre.

La siguiente parada del proyecto es la abstracción, que te dejará definir contratos generales sin atarte a una implementación específica. ¿Qué otros métodos o propiedades agregarías a tu clase Antiheroe para hacerla más realista? Cuéntalo en los comentarios.