Cuando aprendemos Orientación a Objetos, normalmente aparecen los famosos cuatro pilares:
- Encapsulamiento
- Abstracción
- Herencia
- Polimorfismo
Pero hay una pregunta interesante: ¿Qué entendemos realmente por abstracción?
Si entendemos la abstracción como un proceso de generalización, aparece una relación mucho más profunda entre varios de estos conceptos.
Imaginemos un conjunto de objetos:
🐕 Dog
🐕 Dog
🐈 Cat
🐈 Cat
🐎 Horse
Observamos características y comportamientos comunes y realizamos una generalización:
Dog ─┐
Dog ─┤
Cat ─┼──► Animal
Cat ─┤
Horse┘
Estamos clasificando y abstrayendo.
Identificamos qué tienen en común distintos objetos y construimos una representación general.
En un modelo basado en clases, esa abstracción puede representarse mediante una clase:
abstract class Animal {
abstract void makeSound();
}
Esto puede verse como un proceso de clasificación:
> objetos concretos → categoría común → clase.
Pero podemos volver a generalizar.
Tenemos:
Dog
Cat
Horse
↓
Animal
y podemos observar que Animal comparte propiedades con otras entidades:
Animal
Plant
↓
LivingBeing
Otra vez estamos abstrayendo.
Por lo tanto, la abstracción no necesariamente ocurre una sola vez. Podemos construir niveles sucesivos de generalización:
objetos
↓
clases
↓
superclases
↓
abstracciones más generales
La herencia puede verse como el mecanismo que representa una relación de generalización/especialización:
Animal
/ \
Dog Cat
Animal representa una abstracción más general.
Dog y Cat son especializaciones de esa abstracción.
Por eso podemos pensar: La abstracción permite identificar lo general; la herencia permite expresar estructuralmente esa generalización en el modelo.
No son lo mismo, pero están profundamente relacionadas.
El polimorfismo aparece cuando podemos utilizar esas especializaciones a través de la abstracción común:
List<Animal> animals = ...;
for (Animal animal : animals) {
animal.makeSound();
}
No necesitamos saber si estamos tratando con un Dog, un Cat o un Horse.
Trabajamos contra la abstracción Animal.
Entonces podemos visualizarlo así:
ABSTRACCIÓN
│
┌──────────┴──────────┐
│ │
CLASIFICACIÓN GENERALIZACIÓN
│ │
objetos → clases clase → superclase
│
HERENCIA
│
POLIMORFISMO
Entonces, ¿son realmente cuatro pilares independientes?
Quizás no.
Si entendemos abstracción como generalización, entonces la abstracción participa en dos procesos fundamentales del modelado orientado a objetos:
Clasificación: objetos → clase
y generalización
clase → superclase
La herencia es una forma de representar esta última relación, mientras que el polimorfismo permite utilizar diferentes especializaciones mediante una abstracción común.
Esto también nos obliga a revisar una definición muy común: “Abstracción es ocultar los detalles de implementación.”
Eso describe una consecuencia o una técnica de abstracción, pero quizás no su esencia.
Una definición más profunda podría ser: Abstraer es identificar aquello que permanece común entre diferentes casos y construir una representación general que nos permita razonar sobre ellos.
Y desde esa perspectiva, la abstracción no es simplemente uno de los cuatro pilares de OOP: es uno de los procesos fundamentales mediante los cuales construimos el modelo orientado a objetos.
Es decir, la abstracción se utiliza para generalizar un conjunto de objetos en una clase (tomando el comportamiento y atributos comunes) y utilizamos la misma técnica para generalizar un conjunto de clases en clases más generales que nos permitan reutilizar código.
Y si tomamos esta filosofía, lenguajes como Go o Rust son orientados a objetos, por más que no tengan herencia de forma común (como Java o C#) tienen un mecanismo de abstracción con interfaces.
Qué opinan?

No hay comentarios.:
Publicar un comentario