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.

Ejercicio Herencia

Vamos a crear una serie de clases para figuras geométricas.

La clase madre será abstracta y tendrá una propiedad Nombre y un método dibujar abstracto.

De ahí derivaremos una clase para figuras de 2 dimensiones también abstracta que incorpora el método area que nos devuelve un double.

Y de ahí una clase para figuras de 3 dimensiones también abstarcta que incorpore el método volumen.

Por último crearemos las clases cuadrado, circulo, cubo y esfera derivándolas de sus clases más adecuadas e implementando los métodos requeridos.

Una vez hecho esto, creamos otro proyecto para hacerlo mediante interfaces.

Modificadores acceso en C#

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

  • public: Puede obtener acceso al tipo o miembro cualquier otro código del mismo ensamblado o de otro ensamblado que haga referencia a éste. El nivel de accesibilidad de los miembros públicos de un tipo se controla mediante el nivel de accesibilidad del propio tipo.
  • private: solamente el código de la misma class o struct puede acceder al tipo o miembro.
  • protected: solamente el código de la misma class, o bien de una class derivada de esa class, puede acceder al tipo o miembro.
  • internal: Puede obtener acceso al tipo o miembro cualquier código del mismo ensamblado, pero no de un ensamblado distinto. Es decir, internal se puede tener acceso a tipos o miembros desde el código que forma parte de la misma compilación.
  • protected internal: cualquier código del ensamblado en el que se ha declarado, o desde una class derivada de otro ensamblado, puede acceder al tipo o miembro.
  • private protected: se puede tener acceso al tipo o miembro mediante tipos derivados del objeto class que se declaran dentro de su ensamblado contenedor.

Interfaces

Una interfaz define un contrato. Cualquier class o struct que implemente ese contrato debe proporcionar una implementación de los miembros definidos en la interfaz. A partir de C# 8.0, una interfaz puede definir una implementación predeterminada de miembros. También puede definir miembros static para proporcionar una única implementación de funcionalidad común.

https://docs.microsoft.com/es-es/dotnet/csharp/language-reference/keywords/interface

https://geeks.ms/etomas/2010/07/07/c-bsico-interfaces/

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

 

SOLID

Los 5 principios SOLID de diseño de aplicaciones de software son:

  • S – Single Responsibility Principle (SRP)
  • O – Open/Closed Principle (OCP)
  • L – Liskov Substitution Principle (LSP)
  • I – Interface Segregation Principle (ISP)
  • D – Dependency Inversion Principle (DIP)

Entre los objetivos de tener en cuenta estos 5 principios a la hora de escribir código encontramos:

  • Crear un software eficaz: que cumpla con su cometido y que sea robusto y estable.
  • Escribir un código limpio y flexible ante los cambios: que se pueda modificar fácilmente según necesidad, que sea reutilizable y mantenible.
  • Permitir escalabilidad: que acepte ser ampliado con nuevas funcionalidades de manera ágil.

En definitiva, desarrollar un software de calidad.

https://profile.es/blog/principios-solid-desarrollo-software-calidad/

https://www.baeldung.com/solid-principles

Herencia en C#

https://docs.microsoft.com/es-es/dotnet/csharp/fundamentals/tutorials/inheritance

La herencia es uno de los atributos fundamentales de la programación orientada a objetos. Permite definir una clase secundaria que reutiliza (hereda), amplía o modifica el comportamiento de una clase primaria. La clase cuyos miembros son heredados se conoce como clase base. La clase que hereda los miembros de la clase base se conoce como clase derivada.

C# y .NET solo admiten herencia única. Es decir, una clase solo puede heredar de una clase única. Sin embargo, la herencia es transitiva, lo que le permite definir una jerarquía de herencia para un conjunto de tipos. En otras palabras, el tipo D puede heredar del tipo C, que hereda del tipo B, que hereda del tipo de clase base A. Dado que la herencia es transitiva, los miembros de tipo A están disponibles para el tipo D.

https://www.programiz.com/csharp-programming/inheritance

https://docs.microsoft.com/es-es/dotnet/csharp/fundamentals/object-oriented/polymorphism

El polimorfismo suele considerarse el tercer pilar de la programación orientada a objetos, después de la encapsulación y la herencia. Polimorfismo es una palabra griega que significa “con muchas formas” y tiene dos aspectos diferentes:

  • En tiempo de ejecución, los objetos de una clase derivada pueden ser tratados como objetos de una clase base en lugares como parámetros de métodos y colecciones o matrices. Cuando se produce este polimorfismo, el tipo declarado del objeto ya no es idéntico a su tipo en tiempo de ejecución.
  • Las clases base pueden definir e implementar métodosvirtuales, y las clases derivadas pueden invalidarlos, lo que significa que pueden proporcionar su propia definición e implementación. En tiempo de ejecución, cuando el código de cliente llama al método, CLR busca el tipo en tiempo de ejecución del objeto e invoca esa invalidación del método virtual. En el código fuente puede llamar a un método en una clase base y hacer que se ejecute una versión del método de la clase derivada.