# Gambas/Programación Orientada a Objetos

Durante esta sección estarás escarbando en el IDE de Gambas y aprendiendo algunos conceptos clave en tu aprendizaje de Gambas. Aprenderás un concepto de programación importantísimo, conocido como Objeto.
El término de programación Objeto, probablemente es nuevo para ti hasta este momento. Cuanto más trabajes con Gambas más escucharas (y aprenderás) sobre objetos, porque como ya se mencionó antes, Gambas es un lenguaje que soporta programación orientada a objetos (OOP por sus siglas en ingles). Puesto que la programación orientada a objetos es un tema muy complejo y va más allá del alcance de este libro, sólo se cubrirá en un sentido muy general. Aun así, no deja de ser un tanto complicado. El reto ahora para ti es aprender acerca de objetos al mismo tiempo que aprendes Gambas. De hecho, todo en Gambas es un objeto y pertenece a una colección de objetos. Todos los objetos tienen propiedades (también conocidas como atributos), la mayoría también tienen métodos (también llamados comportamientos), y muchos tienen eventos. Sin importar si crearás una aplicación sencilla o una solución de gran escala, debes entender qué es un objeto y como funciona.

## Objetos

Un objetos es una estructura de programación que encapsula datos y funcionalidad como una unidad singular y por lo tanto el único acceso público a ella es a través de sus interfaces: propiedades, métodos y eventos. Los objetos usados más comúnmente son los formularios y los componentes de la interfaz gráfica. En lecciones anteriores se explicó como trabajar con formularios y sus componentes e incluso se mostró como fijar sus propiedades.
Otra importante característica de los objetos es el uso de clases. Una clase es un "machote" o plantilla usado para crear un objeto. Cada objeto de una misma clase tendrá características parecidas. En las clases se definen todas las características particulares del objeto. Cuando escribes un programa en un lenguaje orientado a objetos no defines objetos individuales. En vez de eso, defines clases usadas para crear esos objetos. Cuando agregas una caja de imagen llamada PictureBox1, lo que en realidad estas haciendo es usar la clase PictureBox y crear una instancia de ella.

### Propiedades o Atributos

Las propiedades son datos que diferencias un objeto de otro. Todos los objetos tienen atributos usados para especificar e informar sobre el estado del objeto. Estos pueden ser usados para determinar la apariencia, estado, y otras cualidades de objetos que pertenece a tal clase. En una clase, las propiedades son definidas por variables (lugares para almacenar información en un programa de computación). Las variables instanciadas son propiedades que tienen valores que difieren de un objeto a otro. En otras lecciones ya has usado algunas de ellas al usar el visor de Propiedades del IDE. La ventana de propiedades esta disponible en "tiempo de diseño", y es usada sólo para manipular las propiedades del formulario y sus componentes. También puedes modificar las propiedades en "tiempo de ejecución" usando algo de código. Cuando hacemos referencia a las propiedades en código primero se especifica el nombre del objeto (propiamente hablando, el nombre de la instancia del objeto), seguido de un punto "." y después el nombre de la propiedad, como en el siguiente ejemplo:
O como en la siguiente línea de código valido de Gambas:
Asumamos que tenemos un objeto llamado HeroesCharacter con las siguientes propiedades: Nombre, InterpretadoPor & Habilidad. Ahora tenemos dos instancias de ese objetos llamadas Heroe1 y Heroe2. Para asignar valores a las propiedades de esos objetos usando código haríamos algo parecido a lo siguiente:

#### WITH - END WITH

La estructura WITH - END WITH nos facilita la asignación de variables de objetos pues en vez de teclear vez tras vez el nombre del objeto (de la instancia, propiamente dicho) sólo hacemos mención de él al principio, hacemos todas las asignaciones necesarias y por último cerramos la estructura de asignación.
El ejemplo anterior usando WITH - END WITH se haría de la siguiente manera:

### Comportamiento o Métodos

El comportamiento se refiere a las cosas que la clase del objeto puede hacer a ella misma o a otros objetos. Los métodos pueden ser usados para cambiar las propiedades de un objeto, recibir información de otros objetos, enviar mensajes a otros objetos y/o pedirles que realicen tareas. En otras palabras, los métodos son acciones que los objetos puede hacer, en contraste con las propiedades que sólo describen a los objetos. El comportamiento de una clase es implementado usando métodos. Los objetos se comunican entre ellos usando métodos. Piensa en los métodos como funciones. Cuando invocas un métodos algún código es ejecutado. Puedes pasar datos o parámetros a los métodos, y ellos pueden devolver valores. Sin embargo, un método no necesariamente debe aceptar parámetros ni necesariamente debe devolver algún valor. Invocar un método es muy similar a hacer referencia al valor de una propiedad; primero haces referencia al nombre del objeto, después un punto "." y por último el nombre del método seguido de paréntesis, los cuales opcionalmente puede contener parámetros que serán pasados al método.
Regresemos a nuestro objeto HeroesCharacter. Imagina que nuestra instancia Heroe2 tiene un método llamado ViajarEnTiempo que acepta dos parámetros: fecha y lugar.
Cuando invoques este método nuestro amigo Hiro viajará en el tiempo y el espacio a Mayo 2 del 2009 a la ciudad de México.
Las propiedades y los métodos trabajan de la mano, y algunas veces un método en particular se hace no disponible debido al valor de una o más propiedades. Por ejemplo, si la propiedad Habilidad de Heroe2 se cambiará a "Ninguna" el método ViajarEnTiempo se volvería obviamente inaplicable. Aun podrías llamar al método, pero al hacerlo podrías causar un error o la llamada seria ignorada.

### Crear una clase

Con algo de suerte, solo necesitaras un par de ejemplos para entender mejor estos conceptos (objetos, clases, propiedades y métodos). Crea un nuevo proyecto como una aplicación de línea de comando llamado Objetos. Cuando creas un proyecto de esta manera se genera una aplicación sin ningún formulario, sólo contendrá un módulo llamado MMain. Dentro del IDE de Gambas, haz click derecho sobre el directorio Clases sobre el visor del Proyecto, selecciona Nuevo... en el menu contextual y haz click sobre Clases... bajo el campo Nombre teclea HeroesCharacter y después OK. Después bajo el folder Clases un nuevo archivo de clase es agregado. Aquí es donde declararas tres propiedades y un único método como sigue:
Ahora haz doble click en el modulo MMain y declara dos instancias de la clase HeroesCharacter antes de PUBLIC SUB Main.
Dentro de las líneas PUBLIC SUB Main y END asigna valores a las propiedades como ya habíamos comentado.
Después de estas líneas ahora invocarás el método ImprimeMe como sigue:
Ejecuta el programa y en la consola aparecerán dos líneas de código desplegando los valores de las propiedades de nuestros objetos
La cosa importante para recordar aquí es que los métodos son acciones que los objetos pueden hacer, en este caso imprimir en la consola algún texto y las sus propiedades. En contraste, las propiedades describen el objeto, en esta práctica nos dicen acerca de las características de los objetos Heroe1 y Heroe2. Si esta es la primera vez que escuchas sobre programación orientada a objetos, probablemente parezca un tanto teórico y un poco abrumador. Hasta este punto, debieras haber adquirido un entendimiento básico de clases, objetos, propiedades y métodos. Si no es así, lee nuevamente la sección y has las practicas, porque usaras estos conceptos en las secciones siguientes.

## Herencia

La herencia es uno de los conceptos más cruciales en la programación orientada a objetos. Tiene un efecto directo en como diseñarás y escribirás tus propias clases. La herencia es el mecanismo que permite a una subclase heredar las propiedades y métodos de una superclase.
Vemos el siguiente ejemplo: