Programación orientada a objetos
Principios de la programación orientada a objetos
La programación orientada a objetos (POO) es un paradigma muy extendido en desarrollo de software. Viene a completar un panorama que ya es muy rico del paradigma de procedimientos, así como del funcional.
La POO es una forma de diseño de código que aspira a representar los datos y las acciones como si formaran parte de clases; ellas mismas se convierten en objetos durante su creación en memoria. Este concepto se ha presentado rápidamente en el capítulo anterior: ahora es el momento de comprender su funcionamiento de manera más detallada.
1. ¿Qué es una clase?
Una clase es un elemento del sistema que forma la aplicación. Una clase contiene dos tipos de elementos de código: datos y métodos (que representan acciones). Hay que ver la clase como una caja donde es posible ordenar estos dos tipos de elementos. Para hacer un paralelismo con la vida real, podemos comprender fácilmente que la definición de una clase se aplica a un objeto como un ordenador, por ejemplo. Este último dispone de métodos (encender, apagar, etc.), así como de propiedades (número de pantallas, cantidad de RAM, etc.).
De manera conceptual, una clase solo es una definición. Una vez que haya decidido lo que debe contener, así como sus métodos, es conveniente crearla. Esta acción se llama instanciación. Tras esta operación, obtenemos una instancia en memoria de un objeto.
Vamos a intentar hacer una comparación. Tomemos el ejemplo de una fábrica de producción de objetos de madera. Para poder crear un objeto, se necesita un plan (la clase). Gracias a este último, la máquina puede cortar y juntar los diversos elementos (datos y métodos) para crear una instancia nueva (instanciación).
En C#, la declaración de una clase se hace con la palabra clave class. Hay algunas posibles particularidades, especialmente el ámbito, que estudiaremos justo después, en la sección ¿Qué se puede declarar dentro de una clase? - Métodos, así como los conceptos de static, sealed y el de partial. La sintaxis completa de la declaración de una clase es la siguiente:
AMBITO [static] [sealed] [partial] class NOMBRE_CLASE
El nombre de la clase es libre, pero debe cumplir...
Conceptos avanzados
Después de haber visto los conceptos básicos de la POO, es el momento de descubrir algunos conceptos avanzados.
1. Herencia avanzada
Cuando hemos abordado la cuestión de la herencia, lo hemos hecho a través del prisma de una clase Y que hereda de otra clase X; estas dos clases se pueden crear.
a. Métodos virtuales
Cuando una clase hereda de otra, esta disfruta de manera natural de los métodos y de los datos presentes a los que tiene acceso en la clase madre. Sin embargo, para algunas necesidades puede suceder que la clase hija tenga que redefinir algunos métodos. Con el fin de hacer eso posible, la clase madre debe declarar los métodos como virtuales, lo que significa que definen un funcionamiento concreto, pero sigue siendo posible redefinir este funcionamiento en la clase hija. Esta redefinición se llama sobrecarga de métodos. En este funcionamiento intervienen dos palabras clave:
-
A nivel de la clase madre, es necesario añadir la palabra clave virtual antes del nombre del método.
-
A nivel de la clase hija, es necesario añadir la palabra clave override antes del nombre del método que queramos sustituir.
En concreto, imaginemos que nuestra clase Ordenador dispone de un método Encender, que muestra «Encendido en proceso...», pero queremos mostrar «Su Mac se inicia...» dentro del caso de la clase Mac. Hay varias maneras de responder a esta necesidad; una posible solución es sobrecargar el contenido del método Encender:
public class Ordenador
{
public virtual void Encender()
{
Console.WriteLine("Encendido en proceso...");
}
}
public class Mac : Ordenador
{
public override void Encender()
{
Console.WriteLine("Su Mac se inicia...");
}
}
Cuando llamamos al método Encender de un objeto que resulta ser un Mac, la consola muestra «Su Mac se inicia...», y lo mismo en el caso donde se hemos usado el concepto de polimorfismo:
Ordenador mac = new Mac();
mac.Encender();
Esto se debe sencillamente...
Ejercicio
Ahora que ha adquirido las nociones del desarrollo orientado a objetos, es el momento de pasar a la práctica a través de un ejercicio.
1. Enunciado
El objetivo de este ejercicio es poder gestionar un garaje. El garaje realiza varias operaciones en los coches:
-
Repintar un coche para cambiar el color.
-
Reparar el coche.
-
Hacer el mantenimiento del coche y actualizar la fecha del último mantenimiento.
El garaje también se ocupa de los camiones, pero solo para repararlos. Es necesario proporcionar el color y la marca cuando se crea una instancia de la clase Coche. La fecha del mantenimiento, por su parte, no es obligatoria.
A excepción de asignar o de leer posibles propiedades, las acciones no harán más que mostrar en la consola, gracias al método WriteLine, la acción en cuestión.
Un coche tiene marca, color, fecha de revisión y un indicador de buen funcionamiento.
El pequeño escenario para implementar es el siguiente:
-
Crear un garaje.
-
Crear dos coches (un Peugeot azul y un Ferrari rojo) y un camión.
-
Reparar el Peugeot y el camión, y hacer mantenimiento en el Ferrari.
-
Repintar el Peugeot de color verde.
2. Solución
Tras una simple lectura del enunciado existen, como suele suceder, muchas maneras de resolver este ejercicio correctamente. En este caso, el planteamiento es poner en práctica lo que hemos visto en este capítulo.
Al principio...