

















Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Los mejores documentos en venta realizados por estudiantes que han terminado sus estudios
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Descubre las mejores universidades de tu país según los usuarios de Docsity
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Conceptos básicos de programación orientada a objetos (POO) como herencia, clases, métodos y variables. Se habla de la importancia de la herencia en la reutilización de código y se da un ejemplo de cómo crear una clase en ActionScript. También se explican los conceptos de métodos y variables, incluyendo los tipos de visibilidad (público, protegido y privado) y el uso de la palabra reservada 'this'.
Tipo: Apuntes
1 / 25
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!
Capítulos:
La P.O.O. (también conocida como O.O.P., por sus siglas en inglés) es lo que se conoce como un paradigma o modelo de programación. Esto significa que no es un lenguaje específico, o una tecnología, sino una forma de programar , una manera de plantearse la programación. No es la única (o necesariamente mejor o peor que otras), pero se ha constituido en una de las formas de programar más populares e incluso muchos de los lenguajes que usamos hoy día lo soportan o están diseñados bajo ese modelo (PHP, AS2, AS3,…). Lo que caracteriza a la POO es que intenta llevar al mundo del código lo mismo que encontramos en El Mundo Real™. Cuando miramos a nuestro alrededor ¿qué vemos? pues, cosas, objetos , pero podemos reconocer estos objetos porque cada objeto pertenece a una clase , eso nos permite distinguir, por ejemplo, un perro de un auto (porque son de clases diferentes) y también un TV de otro (porque, aunque sean iguales, cada uno es un objeto distinto). Éste es el modelo que la POO intenta seguir para estructurar un sistema. Es importante recalcar nuevamente que la POO no es un lenguaje de programación , es una forma de enfrentarse a ella. Esto significa que la POO le servirá para desarrollar en muchos de los lenguajes comunes de hoy en día (incluso en ASPuaj! ) manteniendo un mismo esquema mental. Incluso le permitirá enfrentar otros proyectos que no necesariamente estén relacionados con escribir código… (Advertencia: La P.O.O. no cura el cáncer )
No hay un acuerdo aceptado por todo el mundo respecto a cuáles son las características que definen la POO, pero al menos todos concuerdan en estas tres:
Pero la cosa no termina allí, resulta que las aves tienen también ciertos mecanismos específicos, como comer, dormir, reproducirse (¡aléjate Pertvertvaz! ), etc. Estos mecanismos los llamamos métodos. Por último, también sabemos que las aves reaccionan ante ciertos sucesos, como peligro, atracción, defensa… A esto lo llamaremos eventos. Entonces, vemos que una clase es algo así como el concepto de lo que queremos hacer, es como la idea (concebida al detalle) de la cosa, del objeto; pero igual que con las ideas, no puedo hacer nada directamente con una clase (puedes sentarte en una silla, pero no en tu idea de una silla). Sin embargo, esta idea será la que dé forma al objeto que crearemos (que tendrá las características, mecanismos y comportamientos que habíamos pensado en nuestra idea).
Bien, decíamos que una clase es como la definición de un objeto, pero no es el objeto en sí, del modo como una idea no es una cosa física (el ejemplo de la silla). Así que para sentarnos necesitaremos convertir esa idea en algo, en un objeto real; a ese objeto lo llamamos instancia. En un mismo proyecto puedo tener una o más instancias de una misma clase sin problemas.
Cada vez que creamos una nueva instancia, ésta adquiere las propiedades, métodos y eventos de la clase a la que pertenece (es lo que permite la relación es un ), sin embargo, cada instancia es independiente de las otras; esto nos da dos ventajas:
Los elementos básicos de una clase se estructuran de la siguiente forma (más abajo definiremos cada elemento):
Paquete: Aunque podemos colocar nuestras clases en el mismo directorio donde se encuentra el archivo que los usará, siempre resulta más ordenado y eficiente clasificarlos en carpetas, donde podemos colocar aquellas clases que tienen un mismo propósito. Así podemos tener una carpeta llamada graph para clases de tipo gráfico, externalData para clases que conectan y/o procesan datos externos, etc. Estas carpetas son conocidas como paquetes. Otra ventaja de usar paquetes (además de mantener nuestras clases ordenadas) es que nos permiten importar todas las clases que necesitemos de ellos con sólo una línea: import paquete.*, en vez de tener que hacer un import para cada clase. Si te preocupa que terminen importándose más clases de las que necesitas de ese paquete, no hay problema porque sólo se importarán las que sean necesarias y no las que no utilices en el código. En algunos lenguajes, existen palabras reservadas para declarar el paquete al que pertenece una clase (como en el caso de AS3), en estos casos va primero la declaración del paquete y luego la de la clase. En AS3 sería de esta forma: package nombreDelPaquete{ class NombreDeLaClase{ ... } } Clase: La clase, propiamente dicha, se declara con la palabra clave class. Hay un par de cosas que debemos tener en cuenta cuando creamos una clase: No es obligatorio, pero por regla general -los entendidos lo llaman convención y es cuando todos se ponen de acuerdo en hacer algo de la misma forma (¡ja! como si tal cosa fuese posible. Errr… perdón, eso es otro tema)- los nombres de las clases siempre comienzan con mayúsculas. Esto si es obligatorio: El archivo donde se encuentra la clase debe tener el mismo nombre que ésta, respetando mayúsculas y minúsculas. Esto es importante porque los import usan el nombre del paquete (si lo hubiere) y la clase para ubicarlos en el disco, así que si usas diferentes nombres, nunca los hallará y dará error. Si el lenguaje no tiene una palabra reservada para definir el paquete (AS2, por ejemplo), la definición de la clase sería así: class nombreDelPaquete.NombreDeLaClase{ ... } Variables Internas o Privadas:
En último término, todas las propiedades de una clase son en realidad variables, pero no es conveniente que el usuario de la clase pueda manipular directamente estas variables, por ello se mantienen privadas, es decir, sólo pueden llamarse y manipularse dentro del código de la clase, pero no fuera de ellas (o sea que si se trata de llamar a una de estas variables desde la instancia, no funcionará). Para hacer que una variable/función sea privada, se le antepone la palabra private. Constructor: Es la función que se ejecuta cada vez que se crea una instancia de la clase, Si necesitamos que nuestra clase inicie con ciertos valores, colocamos los parámetros correspondientes entre los paréntesis. La función constructora siempre devuelve Void (Vacío). También puede haber casos en los que no queramos que la clase constructora ejecute ningún código. Para ello simplemente la colocamos vacía, es decir, la declaramos pero no ponemos código en ella. Si una clase no tiene un constructor, no puede ser instanciada. Propiedades, Métodos y Eventos de la clase: Decíamos antes que las propiedades son realmente variables dentro de la clase, pero para poder controlar qué puede cambiar o no el usuario de la clase, si los valores son correctos, etc. hacemos uso de unas funciones especiales para definir propiedades: get y set. get permite al usuario recuperar el valor de la propiedad, leerlo, por lo que su salida debe ser correspondiente con la que se espera de la propiedad (por ejemplo, no tendría sentido que la propiedad “nombre” del ejemplo devolviese un número). Si sólo creamos una función get para una propiedad, ésta es de sólo lectura. set es usado para darle un valor a la propiedad, normalmente se añaden aquí los controles para asegurarse que el valor que se asigna es del tipo deseado (y evitar que la clase colapse por un error de tipo de datos). La función de set, al ser para escribir en la propiedad no devuelve ningún tipo de datos, pero debe tener un parámetro que es el valor que se pasará a la variable. Al contrario de get, no puede haber una clase de sólo escritura (después de todo, no tiene ningún sentido tener una propiedad a la que se le pueda asignar un valor pero este no pueda ser recuperado). Los métodos no son más que funciones públicas, que pueden tener o no datos y que afectan a la instancia de alguna forma. Los eventos , al igual que los métodos, son funciones, pero estos reaccionan ante alguna interacción del usuario o pueden ser reescritos por éste. A ellos dedicaremos un post especial. Bien, como ven escribir una clase no es tan complicado como puede pensarse en un principio. Luego hablaremos de las ventajas/desventajas de usar clases, pero por ahora creo que ha sido bastante (al menos yo estoy exhausto ). Sólo decir que si les resulta muy complicado lo que ven acá, repasen los posts anteriores (seee, he tardado mucho en escribir éste) para que lo vean en contexto. También decir que en este caso y todos los que vengan
Para ejecutar esto correctamente, es necesario disponer de una clase que se encargue del manejo de los eventos, tanto de la emisión como de la recepción de los mismos, un eventHandler ; ésta puede ser dada por el mismo lenguaje (por ejemplo, el eventDispatcher en AS) o creada por el propio programador. Veamos un ejemplo de uso en AS2: Programación Orientada a Objetos – Eventos (II)
En este caso, haremos una pequeña adaptación de la clase que habíamos creado al principio, para lanzar un evento cada vez que la persona cumple años.
Bien, lo que hemos hecho es agregar, a nuestra clase Persona, un Despachador de Eventos, también le pedimos que , cada vez que se ejecute el método cumpleanhos , lance un evento, que hemos llamado onBirthday. Para ello, hemos hecho lo siguiente:
refiriendo a la propiedad edad de la instancia en cuestión, igualmente con el nombre. Otra cosa a tener en cuenta es que hemos creado un sólo listener que escuchará a las dos instancias, de modo que, en cada caso, responderá a cualquiera de las dos que lance el evento. Igualmente, es posible asociar varios objetos como listeners de un mismo evento, lo que nos permite hacer que un evento genere una serie de acciones diferentes al mismo tiempo. Programación Orientada a Objetos – Clases Dinámicas y Clases Estáticas
En oposición a las clases cerradas existe lo que se conoce como clases dinámicas. Su principal característica es que permiten agregar en tiempo de ejecución , propiedades y métodos a la clase, es decir, que yo puedo agregar una nueva propiedad a la instancia de mi clase, aunque ésta no haya sido definida originalmente. Veámoslo con un ejemplo comparativo:
Como puedes ver, la única diferencia entre Persona y Persona2 es que en el segundo caso hemos agregado, en la declaración de la clase, la palabra clave dynamic. Esta palabrita es la que hará toda la magia, ya que, como puedes ver en la implementación (más abajo, en la imagen), la instancia de Persona nos dará un error en tiempo de compilación (diciéndonos que la clase Persona no tiene una propiedad llamada apellido ), mientras que Persona simplemente creará la nueva propiedad (fíjate que no existe en la clase) y le colocará el valor correspondiente. De hecho, si has trabajado con AS2 (que supongo que así es), posiblemente esto sea algo que has implementado varias veces. En cualquier caso, no es recomendable usar clases dinámicas a menos que sea necesario,
En este caso, tenemos una clase que contiene un sólo método (getSolidRectangle), que además es de tipo estático (lo sabemos por el uso de la palabra clave static en la declaración del método) y que dibuja un rectángulo con color de fondo sólido en un mc que hemos enviado como primer parámetro. Si nos fijamos en la implementación de la clase, veremos que sólo tiene tres líneas:
procedimientos que queremos reutilizar una y otra vez, pero que no están directamente asociados a un objeto o una clase en particular. Así, en vez de tener que escribir una y otra vez el mismo procedimiento, sólo tenemos que importar la clase y usarla. Si luego queremos hacer cambios en el(los) procedimiento(s), hacemos los cambios en la clase estática y estos se actualizarán automáticamente en todos los sitios donde se utilice. Esto sí es reusabilidad Un dato importante, cuando creamos una clase estática, todos los elementos públicos de dicha clase también deben ser estáticos. Programación Orientada a Objetos – Sub Clases Si revisan nuestro segundo post de POO: Características de la P.O.O., recordarán que, entre ellas, comentábamos acerca de la herencia , diciendo que: La herencia es la capacidad que tiene una clase de derivar las propiedades y métodos de otra. Dicho de otra forma. La herencia se asegura de que una clase, al derivar de otra, tenga las mismas cualidades de la clase de la que proviene, además de las que sean propias de la misma clase. Ocurre lo mismo que con los seres vivos, los animales heredamos de nuestros padres características como tipo, color de piel, capacidades para desarrollar ciertas destrezas, etc. Sin embargo, también tenemos cualidades que nos son propias y que nuestros padres no poseen, como la propia identidad, los gustos propios, etc. En la POO, una clase que deriva de otra es conocida como sub-clase , y aquella de la que proviene se conoce como super-clase. Viéndolo de un modo gráfico, sería algo como esto:
Si no ha quedado claro hasta ahora, vamos a repetirlo de modo sencillo y directo. Crear sub-clases nos permite crear una nueva clase personalizada, tomando los elementos que necesitamos de una clase ya creada. De este modo, no tenemos que volver a escribir todas las propiedades, métodos y eventos que ya tiene la clase que hemos tomado como base, sino que podemos utilizarlos directamente, reinterpretarlos o incluso ocultarlos para que no puedan ser accedidos desde afuera de la clase. Por ejemplo, quizá te interese que pueda cambiarse la altura de la instancia, pero no quieres que pueda cambiarse el ancho, aunque un uso más común es darle a nuestra nueva clase ciertas características que no existen en la super-clase, manteniendo las que ya tenemos en ella, o también para hacer ciertos cambios en la super-clase. Es lo que se conoce como extender una clase y es por ello que la palabra para crear una sub-clase es extends. Programación Orientada a Objetos – Sub Clases (II)
Bien, esto es algo sumamente sencillo. Para crear una sub-clase sólo necesitamos extenderla en la declaración de la subclase: Ejemplo en AS class cfrick.utils.MyMovieClip extends MovieClip{ function MyMovieClip(){ ... } } Ejemplo en AS3: import flash.display.Sprite; package cfrick.utils{ classs mySprite extends Sprite{ function mySprite(){ ... } } } Como habíamos dicho antes, ahora la clase myMovieClip (AS2) y mySprite (AS3) heredan todas las propiedades, métodos y eventos de sus clases padre, que serían MovieClip y Sprite, respectivamente. Lo que seguiría son las propiedades, métodos y eventos correspondientes a esta clase en particular.
Digamos que tenemos un método mover en nuestra clase: class A{ function A(){ ...
} public function mover(pixelstoMove:Number){ this._x += pixelstoMove; } } Ahora resulta que necesitamos hacer una subclase basada en “A” -que en un despliegue de creatividad, llamaremos “B”-, pero necesitamos cambiar un poco ese método “mover”, al cambiar el método, manteniendo la cantidad de parámetros y el tipo de datos de salida, lo estamos sobreescribiendo. En otras palabras, sólo cambiaremos el código dentro de la función y no la función en sí. Por ejemplo: class B extends A{ function B(){ ... } public function mover(pixelstoMove:Number){ this._y += pixelstoMove; } } Esto significa que las instancias de “A” ejecutarán el método “mover” en el eje de las x, mientras las instancias de “B” lo ejecutarán en el eje de las y.
Ya hablamos de cómo sobreescribir nuestros métodos pero ¿qué pasa si la sobreescritura no es suficiente, si necesitamos agregar o cambiar un parámetro, cambiar el tipo de dato del método, etc.? Entonces es cuando sobrecargamos métodos. La sobrecarga consiste en utilizar el mismo nombre de un método existente, pero cambiando sus parámetros (ya sea usando otros o una cantidad de parámetros diferente) y, claro, cambiando también el código correspondiente. Sobrecargar métodos es una forma de dar nuevas opciones a los usuarios, permitiendo que un mismo método realice diferente funciones dependiendo de los parámetros que se le envíen. Un ejemplo de sobrecarga puede ser: class A{ public void message(){ //el código correspondiente } public void message(string msg){ //el código correspondiente } }