Abstracción

Picasso abstracción progresiva
Picasso, abstracción progresiva

Operación intelectual que ignora selectivamente partes de un todo para facilitar su comprensión.

Abstracción en la resolución de problemas: Ignorar detalles específicos buscando generalidades que ofrezcan una perspectiva distinta, más favorable a su resolución [1].  Aislando un elemento de su contexto o del resto de los elementos que lo acompañan. En Programación, el término se refiere al énfasis en el «¿qué hace?» más que en el «¿cómo lo hace?» [2].

Encapsulamiento

Capsula
«Las variables del objeto se localizan en el centro o núcleo del objeto. Los métodos rodean y esconden el núcleo del objeto de otros objetos en el programa. Al empaquetamiento de las variables de un objeto con la protección de sus métodos se le llama encapsulamiento. Típicamente, el encapsulamiento es utilizado para esconder detalles de la puesta en práctica no importantes de otros objetos [3].»
«Es el proceso de almacenar en una misma sección los elementos de una abstracción que constituyen su estructura y su comportamiento; sirve para separar el interfaz contractual de una abstracción y su implantación.» [4]

Dentro de los productos obtenidos por el encapsulamiento tenemos dos:

Modularidad

El código fuente de un objeto puede ser escrito, así como darle mantenimiento, independientemente del código fuente de otros objetos. Así mismo, un objeto puede ser transferido alrededor del sistema sin alterar su estado y conducta.

Ocultación de datos

Un objeto tiene una «interfaz publica» que otros objetos pueden utilizar para comunicarse con él. Pero el objeto puede mantener información y métodos privados que pueden ser cambiados en cualquier tiempo sin afectar a los otros objetos que dependan de ello.

Niveles de ocultación de datos

Para la mayoría de lenguajes estos son los niveles más utilizados:

Herencia

Herencia

La herencia es específica de la programación orientada a objetos, donde una clase nueva se crea a partir de una clase existente. La herencia proviene del hecho de que la subclase (la nueva clase creada) contiene las atributos y métodos de la clase primaria. La principal ventaja de la herencia es la capacidad para definir atributos y métodos nuevos para la subclase, que luego se aplican a los atributos y métodos heredados.

Esta particularidad permite crear una estructura jerárquica de clases cada vez más especializada. La gran ventaja es que uno ya no debe comenzar desde cero cuando desea especializar una clase existente. Como resultado, se pueden adquirir bibliotecas de clases que ofrecen una base que puede especializarse a voluntad.[[http://es.ccm.net/contents/411-poo-herencia]]

Polimorfismo

Polimorfismo
El significado de polimorfismo es, la cualidad de ser capaz de asumir diferentes formas. En orientación a objetos, es la habilidad de vincular objetos de diferentes tipos a un solo identificador en tiempo de ejecución.

Polimorfismo de sobrecarga

El polimorfismo de sobrecarga ocurre cuando las funciones del mismo nombre existen, con funcionalidad similar, en clases que son completamente independientes una de otra (éstas no tienen que ser clases secundarias de la clase objeto).

El polimorfismo de sobrecarga, también nos permite definir operadores cuyos comportamientos varían de acuerdo a los parámetros que se les aplican. Así es posible, por ejemplo, utilizar el operador + para que se comporte de manera distinta cuando está haciendo referencia a una operación entre dos números enteros (suma) o bien cuando se encuentra entre dos cadenas de caracteres (concatenación).

Polimorfismo paramétrico

El polimorfismo paramétrico es la capacidad para definir varias funciones utilizando el mismo nombre, pero usando parámetros diferentes (nombre y/o tipo). El polimorfismo paramétrico selecciona automáticamente el método correcto a aplicar en función del tipo de datos pasados en el parámetro.

Por lo tanto, podemos por ejemplo, definir varios métodos homónimos de suma() efectuando una suma de valores.

El método int suma(int,int) devolvería la suma de dos números enteros.
float suma(float, float) devolvería la suma de dos flotantes.
char suma(char, char) daría por resultado la suma de dos caracteres definidos por el autor.

Una firma es el nombre y tipo (estático) que se da a los argumentos de una función. Por esto, una firma de método determina qué elemento se va a llamar.

Polimorfismo de subtipado

La habilidad para redefinir un método en clases que se hereda de una clase base se llama especialización. Por lo tanto, se puede llamar un método de objeto sin tener que conocer su tipo intrínseco: esto es polimorfismo de subtipado. Permite no tomar en cuenta detalles de las clases especializadas de una familia de objetos, enmascarándolos con una interfaz común (siendo esta la clase básica).

Imagine un juego de ajedrez con los objetos rey, reina, alfil, caballo, torre y peón, cada uno heredando del objeto pieza.
El método movimiento podría, usando polimorfismo de subtipado, hacer el movimiento correspondiente de acuerdo a la clase objeto que se llama. Esto permite al programa realizar el movimiento.de_pieza sin tener que verse conectado con cada tipo de pieza en particular.

Referencias

[1] decsai.ugr.es/~jfv/abs.pdf

[2] https://es.wikipedia.org/wiki/Abstracción_(informática)

[3] http://profesores.fi-b.unam.mx/carlos/java/java_basico3_3.html
[4] https://styde.net/encapsulamiento-en-la-programacion-orientada-a-objetos/