Cuando trabajas con programación orientada a objetos en C#, llega un punto donde un simple string no alcanza para representar la realidad de tus datos. Aquí aprenderás a crear una clase dentro de otra clase y a usar enumeraciones para estructurar mejor tu código y reutilizar componentes entre objetos.
El ejemplo gira en torno a una clase Superhéroe que necesita superpoderes con más detalle: nombre, descripción y nivel. En vez de listar strings, construiremos una clase Superpoder reutilizable entre Superman, Hulk o cualquier personaje que crees.
¿Por qué conviene crear una clase dentro de otra clase?
Usar solo strings limita la información que puedes guardar. Si quieres describir cada superpoder, asignarle un nivel y reutilizarlo entre varios superhéroes, necesitas una estructura más rica.
Piénsalo así: la superfuerza no es exclusiva de Superman. Hulk también la tiene. Si la defines como un objeto independiente, la creas una vez y la reutilizas tantas veces como quieras.
¿Qué significa anidar clases en C#? Es usar una clase como tipo de propiedad dentro de otra. En el ejemplo, Superhéroe contiene una lista de objetos Superpoder, lo que permite manejar datos complejos y reutilizables.
Entre los beneficios concretos de esta estructura están:
- Más información por superpoder, no solo el nombre.
- Reutilización entre múltiples superhéroes.
- Código más mantenible y escalable.
¿Cómo defino una clase Superpoder con propiedades útiles?
La nueva clase necesita propiedades que reflejen lo que quieres modelar [02:30]. En este caso son tres: nombre, descripción y nivel. Tú puedes agregar las que necesite tu proyecto.
El nombre y la descripción son strings normales. El nivel es donde aparece la decisión interesante de diseño: ¿usas un int libre o algo más estricto?
¿Int genérico o enumeración para el nivel?
Un int funciona, pero deja la interpretación del valor al desarrollador. ¿5 es el más fuerte o el más débil? ¿La escala va de 0 a 10 o de 0 a 100? Esa ambigüedad genera errores.
La alternativa es una enumeración [03:45], que fuerza al desarrollador a elegir solo entre valores predefinidos.
csharp
enum NivelPoder
{
NivelUno,
NivelDos,
NivelTres
}
class Superpoder
{
public string Nombre { get; set; }
public string Descripcion { get; set; }
public NivelPoder Nivel { get; set; }
}
Con esto, al asignar el nivel solo puedes usar NivelUno, NivelDos o NivelTres. El editor te lo sugiere y el compilador te lo exige.
¿Qué es una enumeración en C#? Es un tipo que define un conjunto cerrado de valores con nombre. Sirve para evitar valores arbitrarios y dejar claro qué opciones son válidas.
¿Cómo asigno objetos Superpoder a un superhéroe?
Antes de crear los superhéroes, conviene crear los superpoderes una sola vez y reutilizarlos [05:30]. Así, volar o superfuerza existen como objetos independientes que puedes asociar a quien quieras.
csharp
var poderVolar = new Superpoder
{
Nombre = "Volar",
Descripcion = "Capacidad para volar y planear en el aire",
Nivel = NivelPoder.NivelDos
};
var superFuerza = new Superpoder
{
Nombre = "SuperFuerza",
Descripcion = "",
Nivel = NivelPoder.NivelTres
};
Ahora viene el cambio clave en la clase Superhéroe: la propiedad de superpoderes deja de ser una lista de strings y pasa a ser una lista de objetos Superpoder.
¿Qué hace especial al tipo List en C#?
La estructura List<T> es lo que se conoce como tipo generic. Acepta cualquier tipo, ya sea primitivo de .NET o uno definido por ti. Por eso puedes declarar List<Superpoder> sin problema.
csharp
var poderesSuperman = new List<Superpoder>();
poderesSuperman.Add(poderVolar);
poderesSuperman.Add(superFuerza);
superman.Superpoderes = poderesSuperman;
El método Add agrega elementos a la colección. La lista también ofrece métodos para remover, ordenar y recorrer, lo que te da flexibilidad total al manipular grupos de objetos.
¿Para qué sirve List en C#? Es una colección dinámica de elementos del mismo tipo. Permite agregar, quitar, ordenar y recorrer objetos sin definir un tamaño fijo.
Con esta estructura tu código gana en claridad y potencia. Tienes objetos complejos, niveles controlados por enumeración y poderes reutilizables entre todos los superhéroes que crees.
La tarea ahora es tuya: define los superpoderes que se te ocurran, créalos al inicio del programa y asígnalos a cada superhéroe. ¿Qué poder agregarías primero a tu lista? Cuéntalo en los comentarios.