Continuamos con el curso de Programación
Orientada a Objetos, tras una introducción donde podíamos ver por encima las
características de este paradigma de programación, en este segundo capítulo
veremos el concepto de Clases.
Foto tomada de freedigitalphotos.net |
¿Qué es una clase?
Ésta es posiblemente la primera pregunta que
cualquier estudiante se haga al iniciarse en la Programación Orientada a
Objetos.
Una clase es una abstracción de un concepto,
una agrupación de elementos que asociamos con la realidad y que comparten
características comunes.
Desde siempre se han agrupado los elementos
y entidades del mundo real en conjuntos, por ejemplo los grupos animales,
vehículos, carnívoros, insectos, felinos, vertebrados, invertebrados, etc.
La idea es que mediante el uso de las clases
seamos capaces de clasificar y agrupar elementos que comparten características
para así poder programar en base a éste concepto.
Ejemplo.
Pongamos el siguiente ejemplo, supongamos
que queremos agrupar todos los muebles de una oficina, dicho grupo comprendería
las mesas y las sillas, son distintos pero podemos agruparlos en una clase que
englobe sus elementos comunes, es decir, una clase “muebles”.
Otro ejemplo perfectamente válido es el de
los animales, agrupaciones de animales hay infinidad de ellos, pero por ejemplo
podemos clasificarlos en vertebrados e invertebrados, carnívoros y herbívoros,
etc.
Clases y subclases.
En base al ejemplo de los animales o del
mobiliario podemos basar perfectamente nuestra programación en una primera (y
muy general) clase llamada Mobiliario y Animal respectivamente.
Una vez tengamos en mente el concepto de las
clases Mobiliario o Animal, tengamos visualizadas las características de cada
uno y las propiedades que lo definen, podemos afinar un poco más.
En el caso de la clase Animal, somos
conscientes de que todos los animales no son iguales, los hay terrestres,
acuáticos, vertebrados, carnívoros, herbívoros, etc. Es decir, comparten muchas
características pero tienen otras muchas que los hacen muy diferentes.
Debemos comenzar a pensar en que hay que
definir nuevas clases que se ajusten más a estas clasificaciones, pero sin
dejar de perder la referencia mental de que estamos tratando de un Animal.
Es decir, imaginemos que queremos programar
en base a los animales carnívoros, por lo que el paso obvio es pensar en una
clase Carnívoro, es mejor que la clase Animal, y realmente me sirve para mucho
más, por lo que si directamente programo la clase Carnívoro es mejor ¿verdad?
Pues no, para poder hacer esto correctamente
debemos definir primero la clase Animal, y a continuación la clase Carnívoro,
pero de forma que la clase Carnívoro herede las propiedades de Animal, de ésta
forma tendremos las características de ambos y si en un futuro tenemos que
programar la clase Herbívoro no tendremos que programar de nuevo ciertas
características comunes. Este tema se explicará con detenimiento en el tema de
herencia.
Lo importante a tener en cuenta ahora mismo
es que existen clases específicas que son hijas de otras clases más generales.
Con esto nos aseguramos que nuestro desarrollo es bueno y adaptable a cualquier
cambio futuro.
Clases abstractas.
Otro tema que veremos en el siguiente
capítulo es el tema de las clases abstractas. Las clases abstractas son clases
de las que no se pueden instanciar objetos.
¿Esto qué quiere decir? Pues si tomamos de
ejemplo la clase Animal veremos que no deberíamos poder crear objetos que sean
simplemente Animal, para tenerlo perfectamente hecho tendríamos que declarar
una jerarquía de clases, por ejemplo, Animal -> Carnívoro -> Felino y a
partir de la clase Felino crear el objeto Tigre.
¿No puedo crear objetos de la clase Animal?
Sí y no, por una parte como poder se puede, pero no es aconsejable puesto que
necesitamos más elementos que definan los objetos mejor. Un tigre es un animal,
pero un mono también, y ambos son completamente distintos, necesitamos de algo
más, y aquí entran de nuevo las subclases, para que podamos crear objetos mejor
definidos.
Otro ejemplo podría ser el del mobiliario,
podríamos crear las clases Mobiliario -> Asiento y a partir de ahí crear el
objeto Silla.
Una clase abstracta nos da un esquema
general, un esqueleto globalizado de las entidades que va a abarcar, las
subclases siguientes son las que nos darán toda la información que necesitemos,
y que definirá mucho mejor las entidades con las que queremos trabajar.
Es una buena práctica refinar cuanto más
mejor, no deberíamos poder declarar un objeto de una clase abstracta
directamente, puesto que el alcance de ésta en cuanto a características se
refiere no está definido tan al detalle como un animal o un mueble necesita.
Este concepto lo veremos más en profundidad
en el siguiente capítulo
Conclusiones.
Recordemos, una clase es una abstracción o
agrupación de entidades que comparten elementos comunes. Éste concepto es muy
importante y es el pilar básico de la Programación Orientada a Objetos.
Acabamos de ver el concepto de clase, cómo
debemos aplicarlo en base a lo que queremos programar y la mejor forma de ir
definiendo clases. Se ha nombrado en diversos momentos el concepto de Objeto,
tema que trataremos en el siguiente capítulo pero que nos acaba de servir para
poder comprender mejor que es una clase.
En el siguiente capítulo entraremos de lleno
en el concepto de Objeto, veremos la mejor forma de definirlos y comenzaremos a
construir clases y a crear objetos a partir de éstas con el fin de comprender perfectamente
este tema.