Resumen - Lista personalizada
Parte de la sección Programación Orientada a Objetos del Journey de C# de Coddy — lección 40 de 70.
Desafío
FácilVamos a construir una clase CustomList que reúna todas las características avanzadas de este capítulo (sobrecarga de operadores, indexadores, anulación de ToString() y métodos de extensión) para crear una colección que se sienta natural e intuitiva de usar.
Organizarás tu código en tres archivos:
CustomList.cs: Crea una claseCustomListen el espacio de nombresCollectionsque envuelva un arreglo de enteros interno y proporcione patrones de acceso intuitivos. Tu lista debe tener:- Un arreglo de enteros privado para almacenar elementos y una propiedad
Count(con un setter privado) que rastree cuántos elementos hay almacenados - Un constructor que acepte una capacidad (entero) e inicialice el arreglo interno con ese tamaño
- Un método
Add(int item)que añada un elemento a la siguiente posición disponible (si hay espacio) - Un indexador
this[int index]que permita obtener y establecer elementos por posición - Un operador
+sobrecargado que combine dos CustomLists en una nueva que contenga todos los elementos de ambas (la capacidad de la nueva lista debe ser la suma de ambos conteos) - Un método
ToString()anulado que devuelva los elementos en el formato[item1, item2, item3]; solo incluye los elementos hastaCount, no los espacios vacíos
- Un arreglo de enteros privado para almacenar elementos y una propiedad
ListExtensions.cs: Crea una clase estáticaListExtensionsen el espacio de nombresCollectionscon un método de extensión para tu CustomList:Sum(): devuelve la suma de todos los elementos de la lista (hastaCount)
Program.cs: En tu archivo principal, crea dos CustomLists, añade elementos a cada una y luego demuestra todas las características funcionando juntas: usa el indexador para acceder a los elementos, combina las listas con el operador+, imprime usandoToString()y calcula la suma usando tu método de extensión.
Recibirás seis entradas:
- Tres enteros para añadir a la primera lista
- Tres enteros para añadir a la segunda lista
Crea la primera lista con capacidad 5 y la segunda con capacidad 3. Añade los tres valores de entrada a cada lista respectiva.
Imprime la salida en este formato:
List 1: {ToString()}
List 2: {ToString()}
List 1[0]: {first item}
Combined: {ToString() of combined list}
Combined sum: {Sum()}Por ejemplo, si las entradas son 10, 20, 30, 5, 15 y 25, la salida debería ser:
List 1: [10, 20, 30]
List 2: [5, 15, 25]
List 1[0]: 10
Combined: [10, 20, 30, 5, 15, 25]
Combined sum: 105Observa cómo todas las piezas funcionan juntas: el indexador te da un acceso similar al de un arreglo, el operador + te permite combinar listas de forma natural, ToString() proporciona una salida legible y el método de extensión añade funcionalidad de utilidad. ¡Así es como se sienten las clases bien diseñadas!
Pruébalo tú mismo
using System;
using Collections;
class Program
{
public static void Main(string[] args)
{
// Lee seis enteros
int a1 = Convert.ToInt32(Console.ReadLine());
int a2 = Convert.ToInt32(Console.ReadLine());
int a3 = Convert.ToInt32(Console.ReadLine());
int b1 = Convert.ToInt32(Console.ReadLine());
int b2 = Convert.ToInt32(Console.ReadLine());
int b3 = Convert.ToInt32(Console.ReadLine());
// TODO: Crear la primera CustomList con capacidad 5
// TODO: Añadir a1, a2, a3 a la primera lista
// TODO: Crear la segunda CustomList con capacidad 3
// TODO: Añadir b1, b2, b3 a la segunda lista
// TODO: Imprimir List 1 usando ToString()
// TODO: Imprimir List 2 usando ToString()
// TODO: Imprimir List 1[0] usando el indexador
// TODO: Combinar listas usando el operador + e imprimir el resultado
// TODO: Imprimir la suma de la lista combinada usando el método de extensión Sum()
}
}
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosNamespaces y directivasIntro a clases y objetosLa palabra clave 'this'Métodos y parámetrosCampos vs PropiedadesConstructoresInicializadores de objetosResumen - Calculadora simple4Herencia
Sintaxis básica de herencia (:)La palabra clave 'base'Palabras clave Virtual y OverrideClases selladas (Sealed)La clase base 'object'Resumen: Jerarquía de empleados7Características avanzadas
Sobrecarga de operadoresIndexadores (this[])Sobrescritura de ToString()Métodos de extensiónResumen - Lista personalizada10Patrones de diseño - Parte 1
Introducción a los patrones de diseñoSingleton Thread-SafePatrón FactoryPatrón Observer (Eventos)Patrón Strategy2Propiedades y miembros estáticos
Propiedades autoimplementadasPropiedades de solo lectura y escrituraCampos y métodos estáticosClases estáticasMiembros con cuerpo de expresión5Polimorfismo e Interfaces
Polimorfismo: Compilación vs. EjecuciónInterfaz vs. Clase AbstractaInterfaces MúltiplesInterfaces ExplícitasUpcasting y DowncastingRepaso: Calculadora de Figuras8Conceptos avanzados de POO
Composición sobre herenciaGenéricos (clases y métodos)Delegados y eventosAtributos y ReflexiónIDisposable y la sentencia usingFundamentos de Inyección de dependencias11Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite3Arquitectura de clases
Datos de instancia vs. estáticosPalabras clave 'readonly' y 'const'Campos de respaldoResumen - Gestor de cuentas bancarias6Encapsulamiento
Modificadores de accesoPropiedades para el encapsulamientoImplementación de ocultamiento de datosPatrones de inmutabilidadRepaso - Registros de estudiantes