Está en la página 1de 8

Asignatura Datos del alumno Fecha

Apellidos y Nombres: Apolinario Miranda Carlos


POO 1 Paralelo: TIN-S-MA-4-1  
Carrera: TIC

Actividad #6

Investigar las siguientes definiciones en programación orientada a objetos

Generalización y especialización

Una clase de objetos puede introducirse de manera independiente a las demás clases o bien
definirse como subconjunto de alguna otra clase, este subconjunto debería constituir
siempre un conjunto de objetos similares.

Hablamos entonces de subclases de otras clases que, por tanto, constituyen


especializaciones de esas otras clases.

Ejemplo

La clase de los caballos es una subclase de la clase de los mamíferos.

La generalización es la relación inversa a la especialización. Si una clase es una


especialización de otra clase, ésta última es una generalización de la primera. Es su
superclase.

Ejemplo

La clase de los mamíferos es una superclase de la clase de los caballos.

La relación de especialización puede aplicarse a varios niveles, dando lugar a la jerarquía de


clases.

Ejemplo

La clase de los caballos es una subclase de la clase de los mamíferos, ella misma subclase de
la clase de los animales. La clase de los perros es otra subclase de la clase de los mamíferos.
Objeto super
Un objeto es una entidad identificable del mundo real. Puede tener una existencia física (un
caballo, un libro) o no tenerla (un texto de ley). Identificable significa que el objeto se puede
designar.

Ejemplo

Mi yegua Jorgelina
Mi libro sobre UML
El artículo 293B del código de impuestos

En UML todo objeto posee un conjunto de atributos (estructura) y un conjunto de métodos


(comportamiento). Un atributo es una variable destinada a recibir un valor. Un método es un
conjunto de instrucciones que toman unos valores de entrada y modifican los valores de los
atributos o producen un resultado.

Incluso los objetos estáticos del mundo real son percibidos siempre como dinámicos. Así, en
UML, un libro se percibe como un objeto capaz de abrirse él mismo en una página
determinada.

Todo sistema concebido en UML está compuesto por objetos que interactúan entre sí y
realizan operaciones propias de su comportamiento.

Ejemplo

Una manada de caballos es un sistema de objetos que interactúa entre sí, cada objeto posee
su propio comportamiento.

De esta forma, el comportamiento global de un sistema se reparte entre los diferentes


objetos. En nuestro ejemplo bastará con hacer un paralelismo con el mundo real para
comprenderlo.
Polimorfismo
El polimorfismo significa que una clase (generalmente abstracta) representa un conjunto
formado por objetos diferentes, ya que éstos son instancias de subclases diferentes. Cuando
se llama a un método del mismo nombre, esta diferencia se traduce en comportamientos
distintos (excepto en los casos en los que el método es común y las subclases lo han
heredado de la superclase).

Ejemplo

Tomemos la jerarquía de clases ilustrada en la figura 3.7. El método acariciar tiene un


comportamiento diferente según si el caballo es una instancia de CaballoSalvaje o de
CaballoDomesticado. En el primer caso, el comportamiento será un rechazo (que se
traducirá en un encabritamiento) mientras que, en el segundo, el comportamiento será una
aceptación.

Si consideramos la clase Caballo en su totalidad, tenemos un conjunto de caballos que


reaccionan de distinta manera al activarse el método acariciar.
Sobrecarga
Sobrecarga es la capacidad de un lenguaje de programación, que permite nombrar con el
mismo identificador diferentes variables u operaciones.

En programación orientada a objetos la sobrecarga se refiere a la posibilidad de tener dos o


más funciones con el mismo nombre pero funcionalidad diferente. Es decir, dos o más
funciones con el mismo nombre realizan acciones diferentes. El compilador usará una u otra
dependiendo de los parámetros usados. A esto se llama también sobrecarga de funciones.

or ejemplo, si vienes del mundo de Java esto lo habrás visto ya muchísimo y si vienes del
mundo de C/C++ te sonará la sobrecarga de operadores, cosa que me flipa muchísimo pero
que por desgracia todavía no ha llegado a PHP.

A lo mejor te cuesta visualizar qué es el concepto de sobrecarga como para encima hablar de
sobrecargar operadores pero es que el concepto es tan chulo que tengo que explicarlo.

Imagínate una suma de dos valores. Cada valor se encuentra entre un operador numérico
¿no? En este caso el operador es el símbolo de la suma (+) pero en otras operaciones el
operador será otro obviamente. Pues bien, con C/C++ puedes hacer que cuando aparezca el
operador de la suma se imprima un mensaje por consola y en lugar de hacer la suma,
internamente se produzca una resta, por ejemplo.

Es el maximun trolling de la programación jejeje.

Como decía esto todavía no lo tenemos en PHP pero lo que si que tenemos y podemos
utilizar desde ya es la sobrecarga de métodos.
Sobreescritura
La Sobreescritura es la forma por la cual una clase que hereda puede re-definir los métodos
de su clase Padre, de esta manera puede crear nuevos métodos con el mismo nombre de su
superClase....(si no conoces la herencia deberías ver este ejemplo...)

es decir, si tengo una clase padre con el método ingresar() yo puedo crear en la clase hija un
método que también se llame ingresar() pero implementándolo según lo que necesite
(siguiendo obviamente unas reglas que veremos mas adelante).... a esto se le llama
sobreescritura.

Así como en la sobrecarga nos fijamos en los parámetros, en la sobreescritura nos debemos
fijar en que la estructura del método sea igual a la de su superClase, no solo el mismo
nombre sino el mismo numero de argumentos y tipo de retorno (o al menos un subtipo de
este), así como no tener un nivel de acceso mas restrictivo que el original (que en la clase
padre sea protected y en la hija sea private por ejemplo).... tampoco se pueden sobreescribir
métodos static ni final.... (ya que static representa métodos globales y final constantes...)

Algo que también debemos mencionar es que podemos identificar un método sobreescrito
cuando tiene la anotación @override, esto es muy común encontrarlo cuando trabajamos
con clases abstractas o interfaces, donde se obliga a implementar los métodos de estas si
son heredadas o implementadas respectivamente...... sin embargo no es obligatorio ponerlo
pero si es recomendable (tal como lo menciona "David" en un comentario de esta entrada
sobre el polimorfismo) pues de esta manera el compilador reconoce que se están
sobreescribiendo los métodos ayudando a que si nos equivocamos al crear un método
distinto, el compilador nos avisaría....... adicionalmente si tenemos la anotación
inmediatamente podremos saber que se está aplicando el concepto, algo muy útil cuando
trabajamos con código de otras personas.
Enlace dinámico
El enlace dinámico es el proceso de conectar una función (llamada a un procedimiento) a un
método específico (secuencia de código) en tiempo de ejecución. Esto significa que la
función que debe ejecutarse mediante un método permanece desconocida hasta que se
ejecuta -hora. La vinculación dinámica también se conoce como vinculación en tiempo de
ejecución o vinculación tardía.

El concepto de enlace está estrechamente relacionado con otros conceptos de


programación orientados a objetos, como la herencia y el polimorfismo. El enlace
simplemente se refiere al enlace entre la definición del método y la llamada al método. Los
objetos reales se utilizan durante el tiempo de ejecución para el enlace. El enlace dinámico
permite a los desarrolladores interconectar nuevas secuencias de código y objetos con un
sistema sin alterar el código existente, eliminando así las instrucciones de conmutación. La
anulación de métodos es un buen ejemplo de enlace dinámico.

El opuesto de la vinculación dinámica es la vinculación estática. A diferencia del enlace


dinámico, el enlace estático se produce durante la compilación. A veces se lo denomina
enlace anticipado porque el enlace se produce antes de que se ejecute la aplicación. Un
buen ejemplo de enlace estático es la sobrecarga de métodos. Otra diferencia clave entre los
dos tipos de enlace es que el enlace estático utiliza información de clase para el enlace,
mientras que el enlace dinámico utiliza objetos para resolver el enlace. El momento en el
que se produce la vinculación afecta el rendimiento general del programa. Si el enlace se
produce antes, la seguridad y la eficiencia aumentan, mientras que la flexibilidad disminuye.
Upcasting y downcasting

Upcasting es el encasillamiento de un objeto hijo a un objeto padre . El upcasting se puede


hacer implícitamente. Upcasting nos brinda la flexibilidad de acceder a los miembros de la
clase principal, pero no es posible acceder a todos los miembros de la clase secundaria
mediante esta función. En lugar de todos los miembros, podemos acceder a algunos
miembros específicos de la clase secundaria. Por ejemplo, podemos acceder a los métodos
anulados .

Ejemplo: Sea una clase animal . Puede haber muchas clases diferentes de animales. Una de
esas clases es Fish . Entonces, supongamos que la clase fish extiende la clase Animal .

Downcasting es básicamente, lo que estás haciendo es decirle al compilador que sabes cuál
es el tipo de tiempo de ejecución del objeto de Verdad . El compilador permitirá la
conversión, pero seguirá insertando una verificación de validez en el tiempo de ejecución
para asegurarse de que la conversión tenga sentido.

Cuando deseamos convertir una clase Super en Subclases, usamos Downcasting (o


reducción), y Downcasting no es directamente posible en Java, explícitamente tenemos que
hacerlo.

Ejemplo:

No se produce por defecto, ya que un objeto de la clase base no siempre es un objeto de la


clase derivada

Alumno a = new Persona(); // error

Sólo es posible en los casos en los que el objeto de la clase base realmente sea un objeto de
la clase derivada. Estos casos se tendrán que indicar explícitamente con un casting (con una
asignación explícita de la clase)
Clases Wrapper

En la programación orientada a objetos, se usan diferentes patrones estructurales que funcionan


siempre de la misma manera, sin importar el lenguaje de programación que se utilice. Los patrones
de diseño, adaptador y decorador pertenecen a la categoría de patrones estructurales y se
consideran wrappers.

Un adaptador envuelve a dos interfaces incompatibles entre diferentes clases. Al traducir una
interfaz a la otra, las clases ya pueden volver a comunicarse entre sí. Esto es muy importante cuando
queremos seguir usando clases o bibliotecas enteras de clases en proyectos nuevos. Estas bibliotecas
usan interfaces estandarizadas y unívocas que no deben modificarse ya que deben ser compatibles
con un gran número de programas. El wrapper, el adaptador en este caso, es el eslabón intermedio
determinante para la comunicación.

Un decorador permite ampliar una clase con funciones adicionales sin modificarla. Para el objeto de
programa consultante, el decorador presenta la misma interfaz que la clase original. Así, el objeto
que lo consulta no requiere modificación alguna. En su función de wrapper, el decorador transmite
las consultas a la clase. Las funciones nuevas, no incluidas en la clase, son procesadas directamente
por el decorador. A continuación, este devuelve los resultados de manera que el objeto consultante
los perciba como resultados de la clase decorada.

También podría gustarte