Polimorfismo En la POO el polimorfismo se refiere al hecho de que una misma operación puede tener diferente comportamiento en diferentes objetos. En otras palabras, diferentes objetos reaccionan al mismo mensaje de manera diferente. Por ejemplo, supongamos un número de figuras geométricas que responden todas al mensaje Dibujar. Cada objeto reacciona a este mensaje visualizando su figura en la pantalla. Obviamente, el mecanismo real para dibujar los objetos difiere de una figura a otra, pero todas las figuras realizan esta tarea en respuesta al mismo mensaje. Polimorfismo se define como la calidad o estado de ser capaz de asumir formas diferentes. En la solución de un problema orientado a objetos, polimorfismo puede aplicarse a cualquier objetos u operaciones. El uso más común es la operación polimorfismo, que es representada por enviar el mismo mensaje, imprimirlo, a objetos diferentes y cada uno puede ser responder en su propia manera. Polimorfismo puede examinarse desde el punto de vista de sus propiedades suplementarias. Una primera propiedad del polimorfismo es el sobrecarga de identificadores de mensaje y operadores. Polimorfismo es apoyado por la ligadura de un método particular al identificador del mensaje durante la ejecución de un sistema de software. Esta ligadura lenta, o ligadura dinámica, es un aspecto importante de la solución de un problema orientado a objetos. Una de las características más importantes de la programación orientada a objetos es la capacidad de que diferentes objetos responden a órdenes similares de modo diferentes. Identificador de mensaje y operadores sobrecargados. El identificador de mensaje y operador invocan una operación específica sobre un objeto. Cada uno establece la selección del significado uniforme de la operación en particular que se desea realizar, es decir, son utilizados para representar el concepto de una operación e identificar que se ejecutara o realizará. Herencia Es la propiedad que permite a los objetos construirse a partir de otros objetos. Este principio consiste en que cada clase puede dividirse en subclases, es decir, a partir de una clase base se pueden derivar otras clases (clases derivadas) que comparten características comunes con la clase de la que se derivan, además de tener sus propias características particulares. La Herencia permite definir nuevas clase a partir de clases ya existentes. Si una clase sólo recibe características de una clase base, la herencia es simple. Si una clase recibe propiedades de más de una clase base, la herencia es múltiple. Las instancias heredan (usualmente) todas, y únicamente, las características de las clases a las que pertenecen, pero, también, es posible, en un sistema orientado a objetos, que se permita que las clases hereden características de superclases más generales. En ese caso, las características heredadas pueden ser ignoradas (overriden) y se pueden agregar características adicionales para tratar excepciones. La herencia es el acto de adquirir una posesión, condición, o característica de generaciones pasadas. En la solución de un problema de computadora se habla de componentes de software que heredan propiedades que describen otros componentes de software. En la solución de un problema orientado a objetos un tipo de objeto hereda propiedades que caracterizan otro tipo de objeto. Desde las propiedades de objetos son dadas por la descripción de la clase, esto implica una jerarquía de clases, donde una clase es un subclase de otra, la clase padre. Los objetos que son los instancias de las subclases tienen propiedades dadas dentro de la descripción de la subclase así como también propiedades heredadas dadas dentro de la clase padre y todas las clases antecesoras. Así la herencia provee la potencialidad para construir soluciones nuevas a problemas agregando el incremento de la capacidad a soluciones existentes del problema mediante subclases. Las instancias de una subclase representan una especialización de instancias descritas por una clase padre. La instancia de la subclase tiene todos los atributos dados por la clase padre, más los atributos adicionales o agregados de la subclase. La instancia de la subclase responde al mismo conjunto de mensajes dados en la clase padre, los mensajes adicionales se dan en la descripción de la subclase. La respuesta de la instancia de la subclase a los mensajes en la clase padre puede ser diferente de la respuesta de una clase padre de una instancia al mismo mensaje. No es valido considerar subclases de objetos que tengan menos atributos que los objetos descritos por la clase padre. Concepturalización de la herencia Una clase utilizada para derivar nuevas clases se conoce como clase base (padre, ascendiente), y una clase creada de otra clase se llama clase derivada (hija, descendiente, subclase). En un lenguaje Orientado a Objetos la herencia se manifiesta con la creación de un tipo definido por el usuario (Clase), que puede heredar las características de otra clase ya existente o derivar las suyas a otra nueva clase. Cuando se hereda, las clases derivadas reciben las características (estructuras de datos y funciones) de la clase original , a las que se pueden añadir nuevas características o modificar las características heredadas. La herencia se aplica para extender y reutilizar el código existente: Los objetos se pueden construir de modo incremental a partir de otros objetos y pueden compartir código y estructuras de datos Los algoritmos generales se pueden escribir de modo que se pueden reutilizar para nuevos tipos de objetos, incluso después que los algoritmos originales se han compilado. Herencia simple : Se realiza tomando una clase existente y derivando nuevas clases de ella (Figura 2.5 ). La clase derivada hereda las estructuras de datos y funciones de la clase original, Además, se pueden añadir nuevos miembros a las clases derivadas y los miembros heredados pueden ser modificados. Una clase utilizada para derivar nuevas clases se denomina clase base (padre, superclase, ascendiente). una clase creada de otra clase se denomina clase derivada o subclase. A su vez una clase derivada puede ser utilizada como una clase base para derivar más clases. Por consiguiente, se pueden construir jerarquías de clases, en las que cada clase sirve como padre o raíz de una nueva clase Herencia Múltiple : Es aquella en la cual una clase derivada tiene más de una clase base. Aunque el concepto de herencia múltiple es muy útil, el diseño de clases suele ser más complejo, y en ocasiones es preferible realizar la aplicación con herencia múltiple mediante emulación de herencia simple. Encapsulamiento Las estructuras de datos y los detalles de la realización de un objeto se hallan ocultos de otros objetos del sistema. La única forma de acceder al estado de un objeto es enviar un mensaje que haga que uno de los métodos se ejecute. Estrictamente hablando, los atributos son escrituras taquigráficas para los métodos que obtienen y colocan valores. Esto hace que los tipos de objetos sean equivalentes a los tipos de datos abstractos en programación, en términos generales. El resultado de encapsulación es una entidad con fronteras distintas, una interface bien definida, y una representación interna protegida. Para el software de computadora, una encapsulación es un componente de software. La integridad del componente de software como una encapsulación es dependiente de aspectos del lenguaje de computadora en el que se implementa el componente. Encapsulación es un concepto importante para el desarrollo de soluciones del problema que son menos susceptibles a los errores. Un problema es particionado en un número de componentes. Cada componente es encapsulado para interactuar recíprocamente con los otros componentes únicos de manera cuidadosamente prescribidas, como definidas por su interface. En un problema orientado a objetos que resuelve la unidad de encapsulación es el objeto. Los objetos son abstracciones encapsuladas. Combinación de principios La encapsulación es la combinación de los principios de ingeniería de software de modularidad, localización, y ocultamiento de información. Cada una de estas es muy importante para el desarrollo de un sistema eficiente, formal y sostenible. Modularidad - El propósito determinado es particionar requerimientos, el diseño, y software en colecciones o grupos de complejidad y tamaño apropiado, uniforme con las metas de ingeniería de software. Modularidad se usa para construir componentes más grandes y operaciones más pequeñas en el diseño orientado a objetos que cuando se usan métodos funcionales debido a que: - Los módulos - Son creados para abstracciones del objeto más que abstracciones funcionales - Las operaciones - Se deben asignarse y encapsularse dentro del objeto y clase. Localización - El propósito determinado es particionar requerimientos, el diseño y software así que los recursos lógicamente ligados son físicamente agrupados para aumentar la cohesión y para decrecer el acoplamiento. Es más importante localizar una abstracción completa que crear un módulo pequeño. Ocultamiento de Información - Es la consideración del ocultamiento de información (p. ej. diseño, la decisión, los detalles de implementación) a fin de promover la abstracción, soporte al desarrollo ascendente/descendente (top-down) , protege contra la corrupción accidental, y promociona el logro de metas de ingeniería de software. Los recursos de un componente deberían ocultarse a menos que específicamente se necesiten por otro componente. Los datos globales comunes no son usados, pero más bien los atributos se ocultan dentro de objetos y las clases. Cada componente debería dividirse en 2 partes desarrolladas separadamente (y compilables): la especificación (o interface) y el cuerpo (o implementación) Fuente: http://www.itq.edu.mx/vidatec/maestros/sis/mlopez/Tutorial/poo2.htm