Programación Orientada a Objetos – Clases

¡Bienvenidos un día más a un nuevo rootie queridos amigos! Hoy que me siento con fuerzas os traigo otro aburridismo y casi sin chistes fantástico post sobre la programación orientada a objetos, hoy vamos a profundizar en el concepto central de la POO por supuesto me refiero a las clases.

Clases.

Como ya mencionamos, una clase en POO es una plantilla a seguir en la creación de objetos. Esta definirá el estado y comportamiento inicial de la clase. Hay una gran variedad de lenguajes que incluyen las clases como un elemento y que ofrecen diferentes funcionalidades relacionadas con la clase. Cabe destacar que la sintaxis con la que se define una clase varia enormemente entre los diferentes lenguajes.

Estructura.

Una clase contendrá campos de datos, estos son normalmente nombres que se asocian con variables de estado en tiempo de ejecución que pertenecen a la clase o a las instancias específicas de las clases. En la mayoría de lenguajes, la estructura definida por la clase determina la cantidad de memoria utilizada por sus instancias.

En el siguiente ejemplo podemos ver una clase (en PHP) con sus propiedades.

Comportamiento

El comportamiento de una clase se define a través de sus métodos. Estos son subrutinas que puede operar en objetos o clases. Estas operaciones pueden tanto afectar al estado o simplemente proporcionar diferentes formas de acceder al objeto.

Cuando hablamos de métodos, algunos son creados y llamados por el código escrito por el programador, pero hay ciertos métodos especiales (como constructores, destructores, etc) que son creados y llamados por el código generado en la compilación. Pero esto no es siempre así, muchos lenguajes permiten al programador definir y utilizar estos métodos especiales.Existen una gran variedad de métodos, pero cuales son o no soportados, varia en función del lenguaje.

En el siguiente ejemplo podemos ver la misma clase anterior con diferentes métodos, incluyendo el constructor:

Como podemos ver en los ejemplos, estamos utilizando una pseudo variable $this y está disponible cuando un método es invocado dentro del contexto de un objeto y  es una referencia al objeto invocador (en este ejemplo a la clase Vegetal). Gran variedad de lenguajes incluyen this u otras alternativas pare referirse al objeto, para mas info sobre esto aquí tenéis un link a la Wiki 🙂

clase-invocador
¡Invoquemos unos cuántos métodos!

Accesibilidad

Cuando trabajamos con POO, podemos encontrar que una gran variedad de lenguajes, implementan especificadores de acceso, en el ejemplo anterior, podéis ver que ya los he utilizado tanto para las propiedades como para los métodos. Cada lenguaje implementa esto (como todo lo que hemos visto hoy) de una forma diferente, pero hay tres especificadores que suelen ser comunes:

  • public: Permite el acceso desde cualquier parte de nuestro código utilizando su nombre.
  • protected: Permite únicamente el acceso a la clase y todas las subclases.
  • private: Restringe el acceso a la clase en si misma, solo métodos que son parte de la misma clase, pueden acceder a los miembros privados.

Utilizando los especificadores de acceso y un buen diseño de métodos públicos para forzar invariantes de clase es decir restricciones al estado de un objeto. Un buen ejemplo de esto lo podemos ver en el código anterior, donde las propiedades de la clase, son privadas, su valor se asigna en el constructor, pero la clase no tiene ningún método público que permita modificar los valores.

De todos modos, los especificadores de acceso, no tienen porque controlar la visibilidad, puede darse el caso que incluso miembros privados puedan ser visibles para el código del cliente, pero intentar llamar o utilizar miembros privados desde el código cliente, resultará en un error.

Herencia.

En POO, la herencia es una de las técnicas más utilizadas para alcanzar un buen nivel de reutilización y extendibilidad. La herencia, nos permite el crear nuevas clases en las que implementar nuevas funcionalidades, basándonos en clases ya existentes, de las que tomaremos su estado y comportamientos. Haciendo uso de la herencia, nos evitaremos el tener que estar modificando, clases ya existentes para acomodar nuestro código a nuevos requerimientos.

Podemos sintetizar el concepto de herencia en la siguiente frase:

Es la relación entre una clase general y otra más específica.

Por ejemplo, volviendo a nuestros ejemplos de código anteriores, si declaramos una clase Zanahoria derivada de nuestra clase Verdura, la primera heredará automáticamente todos los métodos y variables de la segunda.

Veamos un ejemplo en PHP:

Con estas dos clases, deberíamos instanciarlo de la siguiente manera:

El resultado sería el siguiente:

Como podemos ver, al instanciar Zanahoria, pasando los valores que Verdura exige en el constructor (aunque en este caso no son obligatorios) obtenemos el objeto que implementan tanto las propiedades de la superclase Verdura, como las de su propia clase, con todos los datos y no hemos tenido que modificar la clase padre para integrar su funcionalidad en la clase hija.

Por último, mencionar que cuando usamos la herencia, podemos redefinir la lógica de las funciones (siempre que el método a modificar no sea definido como final) simplemente redeclarándolas en la clase hija, utilizando la misma firma del método.

Tipos de clases.

En OOP podemos encontrar diferentes tipos de clases, que modificarán el comportamiento de la misma. Esto se consigue a través del uso de palabras reservadas como abstract, static, local, etc.

Pero hoy sólo voy a mencionar como destacada la clase abstracta, ya que sobre otros tipos hablaremos en un post más adelante.

clases-abstractas
No nos referimos a esto con abstracto…

En lenguajes que soportan herencia una clase abstracta, es una clase que no puede ser instanciada. Para definir una clase como abstracta, utilizaremos la palabra abstract o implementaremos métodos abstractos en la misma. Una clase abstracta provee de implementaciones para ciertos métodos, o especificará métodos virtuales para ser implementados en clases hijas, para ello se definirán dentro de la clase simplemente el método sin cuerpo:

Ejemplo de esto en PHP:

Esto cuando heredamos la clase, nos forzará a implementar la función cocinar.

Y con esto terminamos nuestro post dedicado a la clase, espero que os sirva de ayuda para profundizar y entender mejor los conceptos de la POO. En la próxima entrada sobre programación orientada a objetos hablaremos, sobre los diferentes tipos de clases y las interfaces.

Para cualquier duda, pregunta, comentario, soborno o amenaza, podéis usar los comentarios o en nuestras redes sociales Facebook y Twitter.

One Comment

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *