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.

Ejercicio clases

Vamos a crear una clase Alumno con las propiedades Nombre y Nota. En el constructor pedimos el nombre. La nota no puede ser menor que 1 ni mayor que 10, menos al inicio que vale 0 (su valor por defecto).

En el toString mostramos el nombre y la nota sólo si es distinto de 0.

Si queremos obtener la nota antes de ponerla nos debe saltar una excepción.

Sobreescrimos el Equals y el operador == y != que nos devolverá cierto si el nombre es el mismo independientemente de la nota.

Crearemos también una clase Aula que tiene un nombre y una capacidad. Almacena un array de alumnos con tamaño máximo de esa capacidad. Nombre y capacidad se piden en el constructor. En el constructor se creará el array con el tamaño que nos pongan.

Creamos un método AddAlumno que nos añade el alumno que nos pasan al array.

Sobrecargamos el método para que pasándole una cadena son cree un alumno y lo añada al array.

Se añaden en la primera posición libre que haya.

Si ya hay un alumno con ese nombre se lanza una excepción.

Si el aula ya está llena se lanza una excepción.

Creamos un método OutAlumno que pasándole un string nos elimina el alumno que se llame así. Si el alumno no está no elimina nada.

Creamos un método Destroy que nos elimina todos los alumnos de la clase.

Creamos un método Contains que pasándole un String nos devuelve true si hay un alumno con ese nombre.

Creamos un método Puntua al que se le pasa el nombre de un alumno y su nota. Si el alumno no existe no hace nada.

Método Media que nos devuelve la media de notas de la clase de los Alumnos que tengan nota.

 

 

Ejercicios sobrecargas

Vamos a utilizar la clase de los pesos y vamos a sobreescribir el ToString() para que nos muestre el nombre completo, la altura, el peso y el IMC

Vamos a sobreescribir el equals para que dos objetos sean iguales si tienen el mismo IMC

Y el operador == y != con la misma condición

También si lo comparamos con un decimal comparando el IMC