Extensiones

Los métodos de extensión permiten “agregar” métodos a los tipos existentes sin crear un nuevo tipo derivado, recompilar o modificar de otra manera el tipo original. Los métodos de extensión son métodos estáticos, pero se les llama como si fueran métodos de instancia en el tipo extendido. En el caso del código de cliente escrito en C#, F# y Visual Basic, no existe ninguna diferencia aparente entre llamar a un método de extensión y llamar a los métodos definidos en un tipo.

 

https://docs.microsoft.com/es-es/dotnet/csharp/programming-guide/classes-and-structs/extension-methods

https://www.tutorialsteacher.com/csharp/csharp-extension-method

Ejercicio campeonato

Vamos a hacer una clase que organice campeonatos.

Será de tipo genérico porque podremos usar Equipos, Jugadores, etc.

Podemos añadir tantos elementos como queramos.

Crearemos un método Organizar que:

  1. Compruebe que el número de equipos sea potencia de 2 (4,8,16,32…)
  2. Desordene los elementos para que no tenga que ver como se han introducido.
  3. Cree los enfrentamientos dos a dos y el árbol de las rondas

Ilustración de Soporte De Torneo De Eliminación Única De Campeonato  Vectorial O Diagrama De Árbol En Color Azul Aislado Sobre Un Fondo Blanco  Campos Para Ocho Jugadores O Equipos Es Adecuado Para

Tipos genéricos propios

Los genéricos presentan el concepto de parámetros de tipo en .NET, lo que permite diseñar clases y métodos que aplazan la especificación de uno o varios tipos hasta que el código de cliente declara y crea instancias de la clase o método.

También puede crear métodos y tipos genéricos personalizados para proporcionar sus propias soluciones generalizadas y patrones de diseño que sean seguros para tipos y eficaces.

El parámetro de tipo T se usa en diversas ubicaciones donde normalmente se usaría un tipo concreto para indicar el tipo del elemento almacenado en la lista. Se usa de estas formas:

  • Como el tipo de un parámetro de método en el método AddHead.
  • Como el tipo de valor devuelto de la propiedad Data en la clase anidada Node.
  • Como el tipo de miembro privado data de la clase anidada.

https://docs.microsoft.com/es-es/dotnet/csharp/fundamentals/types/generics

https://www.tutorialsteacher.com/csharp/csharp-generics

Generics in C#

Ejercicio Agenda

Vamos a crear una agenda de teléfonos. Crearemos la clase Agenda y utilizaremos un SortedList<string,string).

Tendremos los siguientes métodos:

agregarContacto(nombre,telefono) Añade el nombre a la agenda, si ya está cambia el número

quitarContacto(nombre) Elimina el nombre y el número de la agenda

telefono(nombre) Nos devuelve el teléfono de ese contacto

nombre(telefono) Nos devuelve el nombre del contacto que tenga ese teléfono

repetidos() Nos devuelve una lista con los contactos que tengan el mismo teléfono (List de string con los nombres)

Sobreescribiremos el método toString para que nos muestre toda la agenda.

Colecciones genéricas

https://docs.microsoft.com/es-es/dotnet/standard/generics/collections

Muchos de los tipos de colección genéricos son análogos directos de tipos no genéricos. Dictionary<TKey,TValue> es una versión genérica de Hashtable; usa la estructura genérica KeyValuePair<TKey,TValue> para la enumeración en lugar de DictionaryEntry.

List<T> es una versión genérica de ArrayList. Hay clases Queue<T> y Stack<T> genéricas que se corresponden con las versiones no genéricas.

Hay versiones genéricas y no genéricas de SortedList<TKey,TValue>. Ambas versiones son híbridos de un diccionario y una lista. La clase genérica SortedDictionary<TKey,TValue> es un diccionario puro y no tiene ninguna homóloga no genérica.

La clase genérica LinkedList<T> es una lista vinculada genuina. No tiene ninguna homóloga no genérica.

Ejercicio arraylist

Vamos a pedir al usuario el nombre de varios alumnos hasta que introduzca la palabra ‘fin’. Obviamente la palabra fin no la añadimos.

Ordenamos los alumnos alfabeticamente y los mostramos.

Si hay algún nombre repetido lo eliminamos.

Juegos de cartas

Vamos a desarrollar una serie de clases para jugar a la baraja.

Una baraja se compone de cartas, que suelen tener un palo y un valor.

Hay dos tipos de barajas clásicas. La francesa, de 52 cartas y la española, de 40. Cada una tiene sus palos y su numeración.

Con la baraja española podemos jugar a juegos como el MUS  y con la francesa a juegos como el póquer.

Quiero poder hacer partidas de mus y póquer y me gustaría tener unas clases que me puedan representar los valores de esas partidas e incluso saber que jugador es el que gana.

Por ejemplo, tengo que tener una baraja y de esa baraja tendré que poder barajarla (aleatorizarla) y repartir cartas (obtener cartas de la baraja).

En el caso del mus tengo 4 jugadores y se reparten 4 cartas a cada uno. Hay cuatro comprobaciones: Grande, pequeña, pares y juego. Tendríamos que poder saber cual de los 4 jugadores gana en cada apartado.

En el caso del póquer tenemos un número indeterminado de jugadores (entre 2 y…). Se reparten 5 cartas y tendríamos que saber qué jugador es el que gana. Aquí sólo tenemos una comprobación.