Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad

Fundamentos de POO: herencia, clases, métodos y variables., Apuntes de Programación Orientada a Objetos

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

2019/2020

Subido el 30/11/2020

bartolomeonzki
bartolomeonzki 🇲🇽

1 documento

1 / 25

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
1
Capítulos:
1. ¿Qué es P.O.O.?
2. Características de la P.O.O.
3. Clase e Instancia
4. Cómo Escribir Una Clase
5. Eventos (I)
6. Eventos (II)
7. Clases Dinámicas y Clases Estáticas
8. Sub Clases (I)
9. Sub Clases (II)
10. Ámbito, Public, Private, Protected, Local
¿Qué es la Programación Orientada a Objetos?
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 )
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19

Vista previa parcial del texto

¡Descarga Fundamentos de POO: herencia, clases, métodos y variables. y más Apuntes en PDF de Programación Orientada a Objetos solo en Docsity!

Capítulos:

  1. ¿Qué es P.O.O.?
  2. Características de la P.O.O.
  3. Clase e Instancia
  4. Cómo Escribir Una Clase
  5. Eventos (I)
  6. Eventos (II)
  7. Clases Dinámicas y Clases Estáticas
  8. Sub Clases (I)
  9. Sub Clases (II)
  10. Ámbito, Public, Private, Protected, Local

¿Qué es la Programación Orientada a Objetos?

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 )

Características de la P.O.O.:

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:

  1. Abstracción.
  2. Encapsulación.
  3. Herencia. Abstracción: Cada vez que pronunciamos una palabra, realmente lo que hacemos es asociar ese sonido (o ese conjunto de garabatos al escribir) con una serie de cosas. Decimos que una ave es tal cosa, que una silla es tal otra, etc. Cuando vamos a aplicar la POO, lo primero que debemos hacer es cumplir con una vieja máxima de guerra: Divide y Vencerás. Es decir, lo que hacemos es seccionar nuestro código en grupos de código más pequeño que, al unirlos, hacen el trabajo. Un buen ejemplo de abstracción es el cuerpo humano, aunque el cuerpo es una unidad, está dividido en lo que conocemos por sistemas (el sistema respiratorio, el sistema linfático, cardiovascular, etc., etc.). Estos sistemas, a su vez están compuestos por otros más pequeños: los órganos, y así sucesivamente. La abstracción nos permite dividir nuestro programa en distintos objetos que se agrupan para formar cosas más complejas. Pero ¿qué demonios es realmente la abstracción? Básicamente es la capacidad de separar los elementos (al menos mentalmente) para poder verlos de forma singular. Como cuando describimos el cuerpo humano y decimos cabeza, brazo(s), pierna(s), etc. Encapsulación: También conocida como ocultamiento. Cuando me acuesto a ver televisión no me preocupo del modo como éste funciona, o lo que hace para cambiar de canal o aumentar el volumen. A menos que seas experto en electrónica o técnico en televisores, te pasará lo mismo: no lo sabes y no te importa; sólo sabes que al presionar un botón ocurre la magia. La encapsulación se encarga de mantener ocultos los procesos internos que necesita para hacer lo que sea que haga, dándole al programador acceso sólo a lo que necesita. Esto da dos ventajas iniciales: Lo que hace el usuario puede ser controlado internamente (incluso sus errores), evitando que todo colapse por una intervención indeseada (tú no quieres que tu mamá, que no tiene ni idea de electrónica, abra tu televisor y empiece a jugar con los circuitos para cambiar los canales manualmente ¿verdad?). La segunda ventaja es que, al hacer que la mayor parte del código esté oculto , puedes hacer cambios y/o mejoras sin que eso afecte el modo como los usuarios van a utilizar tu código. Sólo tienes que mantener igual la forma de acceder a él (en el caso del control de la tele, que los botones sigan siendo los mismos y que el botón de “apagado” no cambie el volumen). Por cierto, estas puertas de acceso que das a los usuarios son lo que se conoce como interfaz.

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).

¿Qué es una Instancia?

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:

  1. Si hago algún cambio en la clase, todas las instancias de esta clase se actualizarán automáticamente; esto nos permite hacer cambios sin tener que ir a cada una de las instancias (se aplica el mismo principio de herencia, aunque a un nivel diferente).
  2. Al ser independientes de las otras instancias, puedo darles valores diferentes sin que afecten a las demás (como tener una silla negra, una roja, una más alta, etc.). Aunque comparten la misma estructura, pueden programarse individualmente, dando versatilidad y flexibilidad al código. Es importante tener en cuenta que cada lenguaje tiene, de acuerdo a su sintaxis, sus propias normas sobre cómo escribir clases. No será lo mismo en PHP que en AS2 o incluso AS3. Así que, primero, hablaremos en un sentido más general, para luego pasar a la práctica concreta. Para los efectos, usaremos como lenguaje de ejemplo Action Script 2..

Estructura de la Clase

Los elementos básicos de una clase se estructuran de la siguiente forma (más abajo definiremos cada elemento):

  1. Paquete al que pertenece la clase ( package – sólo en AS3, en AS2 se incluye en la Definición de la Clase).
  2. Definición de la Clase ( class – En AS2, si la clase está incluida en un paquete, se usa la sintaxis paquete.clase ).
  3. Variables Internas (Son de uso interno de la clase, por lo que se restringe su uso fuera de ellas con la palabra clave private , así la variable miVar , de tipo numérico, podría definirse así: private var miVar:Number = 0;)
  4. Constructor de la Clase (excepto en el caso de las clases estáticas, pero de eso hablaremos en otro post).
  5. Propiedades, Métodos y Eventos de la Clase (no necesariamente en ese orden, pero es una buena forma de organizarlo). Por supuesto, una clase bien hecha contiene además comentarios con información sobre la clase, la forma de usarla, su autor, etc. En este caso lo omitimos para concentrarnos en lo básico y no enredarnos más de lo estrictamente necesario. Dicho esto, veamos los puntos nombrados arriba en una clase de ejemplo, para luego pasar a explicar los conceptos:

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)

Despacho (emisión) de Eventos

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:

  1. Importamos la clase EventDispatcher , que es una clase estática, por lo que no hace falta instanciarla (más adelante hablaremos de las clases estáticas).
  2. La clase EventDispatcher requiere que declaremos tres funciones: addEventListener , removeEventListener y dispatchEvent. Luego veremos para qué se utilizan.

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

Clases Dinámicas

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:

  1. Importa la clase.
  2. Crea el movieclip donde dibujaremos el rectángulo.
  3. Llamamos al método getSolidRectangle para dibujar el rectángulo en cuestión Como te habrás dado cuenta, en este caso no hemos creado una instancia de Graph (que lo haríamos con la palabra clave new ). Esto se debe a que las clases estáticas no se instancian (o sea, que no podemos crear objetos a partir de ellas), sino que podemos usar directamente sus elementos, simplemente apuntando a al clase misma (Graph.getSolidRectangle()). Si alguna vez has usado la clase Math sabes de lo que estoy hablando. Es por eso que las clases estáticas normalmente son utilizadas para albergar esos

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)

Crear una Sub-Clase:

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.

Sobre-escribir Métodos en una Sub-Clase:

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.

Sobrecargar Métodos:

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 } }

Acceder a la Super Clase: