La habilidad para empaquetar datos junto con funciones permite
la creación de nuevos tipos de datos. Esto se llama a menudo
encapsulación
[48]
Un tipo de dato existente puede contener varias piezas de datos
empaquetadas juntas. Por ejemplo, un float
tiene un
exponente, una mantissa y un bit de signo. Le podemos pedir que
haga varias cosas: sumarse a otro float
o a un
int
, etc. Tiene características y comportamiento.
La definición de Stash
crea un nuevo tipo de dato. Se
le pueden agregar nuevos elementos (add()
),
sacar (fetch()
) y agrandarlo
(inflate()
). Se puede crear uno escribiendo
Stash s;
igual que cuando se crea un
float
diciendo float x;
. Un
Stash
también tiene características y un
comportamiento bien determinado. Aunque actúe igual que un tipo de
dato predefinido como float
se dice que
Stash
es un tipo abstracto de
dato tal vez porque permite abstraer un concepto desde
el espacio de los problemas al espacio de la solución. Además, el
compilador de C++ lo tratará exactamente como a un nuevo tipo de
dato y si, por ejemplo, declara una función que acepta un
Stash
como argumento, el compilador se asegurará de
que no se le pase otra cosa a la función. De modo que se realiza
el mismo nivel de comprobación de tipos tanto para los tipos
abstractos de datos (a veces también llamados tipos
definidos por el usuario) como para los tipos
predefinidos.
Sin embargo, notará inmediatamente una diferencia en la forma en
que se realizan las operaciones sobre los objetos. Se hace
objeto.funciónMiembro(listaArgumentos)
o sea,
«se llama a un método de un objeto». Pero en la
jerga de la orientación a objetos, eso también se denomina
«enviar un mensaje a un objeto». De modo que para
una Stash s
, en esta jerga la sentencia
s.add(&i)
le «envía un mensaje a
s
» diciéndole «añadete
(add()
) esto». De hecho, la
programación orientada a objetos se puede resumir en la
siguiente frase: enviar mensajes a
objetos. Realmente, ¿eso es todo lo que se hace?
crear un montón de objetos y enviarles mensajes. El truco,
obviamente, es entender qué son en nuestro
problema los objetos y los mensajes, pero una vez que se ha
cumplido esa etapa, la implementación en C++ será
sorprendentemente directa.
[48] Este término puede causar debates. Algunas personas lo utilizan tal y como está definido aquí, aunque otras lo usan para describir el control de acceso, término que se discutirá en el siguiente capítulo.