El polimorfismo dentro de la programación orientada a objetos

El polimorfismo permite que una clase hija modifique el comportamiento de un método de la superclase.

Ejemplo con la música

Queremos realizar una aplicación que haga sonar varios instrumentos musicales a la vez para interpretar una composición musical.

Como podemos modelar nuestra orquesta de la forma que prefiramos podemos crear una clase DirectorDeOrquesta que dará órdenes a un listado de instrumentos musicales. De esta forma nuestro director de orquesta puede dar órdenes a una orquesta que tenga un tamaño indeterminado.

Para conseguir esto cada instrumento musical debe responder a una órden específica del director de orquesta. Esta órden puede estar representada por una llamada al método tocar de cada instrumento musical.

Nuestra clase directorDeOrquesta sería algo como:

Clase Director

    atributos: listaDeInstrumentos

    Métodos: tocarLista

Imaginemos que tenemos la clase InstrumentoMusical y la declaramos así:

Clase InstrumentoMusical

    Atributos: nombre, tipo

    Métodos: tocar

Esta clase al ejecutar el método tocar mostrará un mensaje por pantalla.

Veamos la definición de la clase InstrumentoMusical con más detalle:

Clase InstrumentoMusical

    nombre, tipo



    función tocar() {

        imprime("El instrumento suena")

    }

Ahora imaginemos que queremos declarar las clases Flauta y la clase tambor. La declaración quedaría así:

Clase Flauta que hereda de InstrumentoMusical

    función tocar() {

        imprime("Piiiiiiii")

    }



Clase Tambor que hereda de InstrumentoMusical

    función tocar() {

        imprime("Bum")

    }

De esta forma las clases hijas tienen comportamientos personalizados para el método tocar que ha sido heredado de su clase padre.

El polimorfismo es la capacidad de un programa de detectar la verdadera clase de un objeto e invocar su implementación, incluso aunque su tipo real sea desconocido en el contexto actual.
También se puede pensar en el polimorfismo como la capacidad de un objeto para “fingir” ser otro objeto,

Cómo exportar desde MacOS un documento de Pages a PDF incluyendo atributos de accesibilidad

En MacOS desde hace unos años se incluye la suite ofimática Iwork.

Esta suite ofimática desarrollada por Apple incluye hojas de cálculo, editor de presentaciones y un potente procesador de textos. Este procesador de textos tiene como nombre Pages.

Marcado de accesibilidad en Pages

En Pages es muy sencillo etiquetar la accesibilidad en los párrafos. Simplemente debemos seleccionar un párrafo de nuestro documento y en la herramienta de formateo elegir un estilo de párrafo como pueden ser título, encabezado de nivel 1 o encabezado de nivel 2.

También en la herramienta de formateo se pueden indicar las descripciones alternativas para imágenes, elementos incrustados o campos de formulario.

Exportando a PDF respetando la accesibilidad

Una vez tengamos nuestro documento de Pages accesible respetando los estilos de párrafo, descripciones para imágenes e incluyendo las demás marcas semánticas para mejorar la accesibilidad es momento de realizar el proceso de exportación a PDF.

En el menú Archivo encontramos la opción exportar a …,y en el submenú debemos elegir la opción PDF.

Nos aparecerá el menú de exportación donde confirmaremos el formato de fichero a exportar, en nuestro caso PDF; la calidad del documento y, cosa importante, dentro del botón de opciones avanzadas encontraremos el nivel de exportación de los elementos de accesibilidad.

Esta opción viene en el valor por defecto. Este valor sólo afecta a la conversión de elementos de maquetación de datos. Elementos como marcas de encabezado, etiquetas de controles de formulario o descripciones alternativas para elementos visuales no serán incluidas en el documento PDF generado tras la exportación.

Según nos indica Pages su descripción es:

Se etiqueta el documento cuando las tablas tienen menos de 10.000 celdas. El etiquetado incrementa el tiempo de exportación y el tamaño del archivo.

Debemos cambiar este valor al valor activada ya que esto nos garantiza que se incluirán todas las etiquetas de accesibilidad posibles.

Su descripción según Pages es la siguiente:

Siempre se etiqueta el documento, lo que hace que se incremente el tiempo de exportación y el tamaño del archivo especialmente en el caso de documentos grandes o complejos.

Con esta opción de accesibilidad activada ya podemos pulsar el botón de Siguiente para que Pages nos pregunte dónde guardar el nuevo documento generado.

La herencia dentro de la programación orientada a objetos

La herencia es la capacidad de crear nuevas clases a partir de otras clases anteriores.

La principal ventaja de la herencia es la reutilización de código.

Si se quiere crear una clase ligeramente diferente a una ya existente, no es necesario duplicar el código. En su lugar, se amplía la clase existente y se coloca la funcionalidad adicional dentro de una subclase resultante que hereda los campos y métodos de la superclase.
Una de las consecuencias del uso de la herencia es que las subclases tienen la misma interfaz que su clase padre. No se puede esconder un método en una subclase si este mismo método se declaró en la superclase de forma pública.

Las interfaces de clase dentro de la programación orientada a objetos

Ahora que conocemos los conceptos de abstracción y encapsulación podemos hablar de las interfaces de clase dentro de la programación orientada a objetos.

La interfaz de una clase es un listado de métodos que, en el caso de tratarse de una interfaz pública, estos métodos son conocidos por los objetos alrededor de nuestra clase.

Las interfaces y la forma de modelar las clases y métodos abstractos en la mayoría de los lenguajes de programación se basan en conceptos de abstracción y encapsulación.

En los lenguajes modernos de programación orientada a objetos, el mecanismo de la interfaz (declarado normalmente con la palabra clave interface o protocol) permite definir contratos de interacción entre objetos. Esto recalca el interés de reflejar en las interfaces sólo los métodos y no los atributos por esta razón hay muchos lenguajes de programación orientada a objetos que no permiten la declaración de atributos en las interfaces de clase.

Una clase puede tener una interfaz pública, otra interfaz privada y otra interfaz protegida dependiendo de cómo se declaren los distintos métodos de la clase. De esta forma los métodos de la clase estarán disponibles a distintos niveles de complejidad.

La encapsulación dentro de la programación orientada a objetos

Para encender una televisión sólo tienes que pulsar el botón de encendido, los detalles de la alimentación eléctrica, el arranque del sistema software de la televisión, la decodificación de la señal de la televisión o la distribución de los cables y circuitos que componen el aparato de televisión permanecen ocultos para los usuarios bajo la carcasa de la televisión. El usuario sólo tiene que saber cuál es el botón de encendido, los botones para cambiar de canal y los botones para modificar el nivel de volumen brillo y otros detalles simples de configuración.

El hecho de ocultar el comportamiento y atributos internos de una clase con el objetivo de simplificar la interfaz ofrecida a otros objetos se denomina encapsulación ya que lo que estamos haciendo es ocultar en cápsulas elementos que resultan innecesarios a objetos de fuera de nuestra clase.

Este ejemplo ilustra cómo funciona una interfaz pública de una clase. A otros objetos se les ofrece un conjunto de métodos y atributos pero no se les deja ver cómo se trata esa información o si hay más métodos internos. A los objetos que trabajan con nuestra clase sólo les interesa los resultados que se pueden obtener de los atributos y métodos públicos.

La encapsulación es la capacidad de un objeto para ocultar partes de su estado y comportamiento de otros objetos, exponiendo únicamente una interfaz limitada al resto del programa.
Encapsular algo significa hacerlo privado y, por ello, disponible únicamente dentro de los métodos de su propia clase.

Existe el modelo protegido que resulta un poco menos restrictivo que el modelo de la encapsulación. En el modelo protegido los métodos de una clase están también disponibles para las clases hijas.