Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Actividad #6
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.
Ejemplo
Ejemplo
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
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.
Ejemplo
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.
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.
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.
Ejemplo:
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
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.