Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO Pensar en C++ (Volumen 1) - Grupo ARCO

arco.esi.uclm.es
from arco.esi.uclm.es More from this publisher
13.01.2015 Views

✐ ✐ ✐ “Volumen1” — 2012/1/12 — 13:52 — page 6 — #44 ✐ Capítulo 1. Introducción a los Objetos ría cambiar la implementación interna de la clase sin preocuparse de cómo afectará a los programadores clientes. Por ejemplo, podría implementar una clase particular de una manera sencilla para un desarrollo fácil, y más tarde descubrir que necesita reescribirla para hacerla más rápida. Si la interfaz y la implementación están claramente separadas y protegidas, puede lograrlo fácilmente y sólo requiere que el usuario vuelva a enlazar la aplicación. C++ utiliza tres palabras reservadas explícitas para poner límites en una clase: public, private, y protected. Su uso y significado son bastante sencillos. Estos especificadores de acceso determinan quién puede usar las definiciones que siguen. public significa que las definiciones posteriores están disponibles para cualquiera. La palabra reservada private, por otro lado, significa que nadie puede acceder a estas definiciones excepto el creador del tipo, es decir, los métodos internos de la clase. p- rivate es una pared entre el creador de la clase y el programador cliente. Si alguien intenta acceder a un miembro privado, obtendrá un error al compilar. protected actúa como private, con la excepción de que las clases derivadas tienen acceso a miembros protegidos, pero no a los privados. La herencia se explicará en breve. 1.4. Reutilizar la implementación Una vez que una clase se ha creado y probado, debería constituir (idealmente) una unidad útil de código. Sin embargo, esta reutilización no es tan fácil de conseguir como muchos esperarían; producir un buen diseño requiere experiencia y conocimientos. Pero una vez que lo tiene, pide ser reutilizado. El código reutilizado es una de las mejores ventajas de los lenguajes para programación orientada a objetos. La forma más fácil de reutilizar una clase es precisamente utilizar un objeto de esa clase directamente, pero también puede colocar un objeto de esta clase dentro de una clase nueva. Podemos llamarlo «crear un objeto miembro». Su nueva clase puede estar compuesta de varios objetos de cualquier tipo, en cualquier combinación que necesite para conseguir la funcionalidad deseada en su nueva clase. Como está componiendo una nueva clase a partir de clases existentes, este concepto se llama composición (o de forma más general, agregación). A menudo nos referimos a la composición como una relación «tiene-un», como en «un coche tiene-un motor». Coche Motor Figura 1.2: Un coche tiene un motor (El diagrama UML anterior indica composición con el rombo relleno, lo cual implica que hay un coche. Típicamente usaré una forma más simple: sólo una línea, sin el rombo, para indicar una asociación. 5 ) La composición es un mecanismo muy flexible. Los objetos miembro de su nueva clase normalmente son privados, haciéndolos inaccesibles para los programadores clientes que están usando la clase. Eso permite cambiar esos miembros sin perturbar al código cliente existente. También puede cambiar los miembros del objeto en tiem- 5 Normalmente esto es suficiente para la mayoría de los diagramas y no necesita especificar si está usando agregación o composición. 6 ✐ ✐ ✐ ✐

✐ ✐ ✐ “Volumen1” — 2012/1/12 — 13:52 — page 7 — #45 ✐ 1.5. Herencia: reutilización de interfaces po de ejecución, para cambiar dinámicamente el comportamiento de su programa. La herencia, descrita más adelante, no tiene esta flexibilidad dado que el compilador debe imponer restricciones durante la compilación en clases creadas con herencia. Como la herencia es tan importante en la programación orientada a objetos, se suele enfatizar mucho su uso, y puede que el programador novel tenga la idea de que la herencia se debe usar en todas partes. Eso puede dar como resultado diseños torpes y demasiado complicados. En lugar de eso, debería considerar primero la composición cuando tenga que crear nuevas clases, ya que es más simple y flexible. Si acepta este enfoque, sus diseños serán más limpios. Una vez que tenga experiencia, los casos en los que necesite la herencia resultarán evidentes. 1.5. Herencia: reutilización de interfaces En sí misma, la idea de objeto es una herramienta útil. Permite empaquetar datos y funcionalidad junto al propio concepto, además puede representar una idea apropiada del espacio del problema en vez de estar forzado a usar el vocabulario de la máquina subyacente. Esos conceptos se expresan como unidades fundamentales en el lenguaje de programación mediante la palabra reservada class. Sin embargo, es una pena tomarse tantas molestias en crear una clase y verse obligado a crear una más para un nuevo tipo que tiene una funcionalidad similar. Es más sencillo si se puede usar la clase existente, clonarla, y hacerle añadidos y modificaciones a ese clon. Esto es justamente lo que hace la herencia, con la excepción de que si cambia la clase original (llamada clase base, super o padre), el «clon» modificado (llamado clase derivada, heredada, sub o hija) también refleja esos cambios. Base Figura 1.3: subclases (En el diagrama UML anterior, la flecha apunta desde la clase derivada hacia la clase base. Como puede ver, puede haber más de una clase derivada.) Un tipo hace algo más que describir las restricciones de un conjunto de objetos; también tiene una relación con otros tipos. Dos tipos pueden tener características y comportamientos en común, pero un tipo puede contener más características que otro y también puede manipular más mensajes (o hacerlo de forma diferente). La herencia lo expresa de forma similar entre tipos usando el concepto de tipos base y tipos derivados. Un tipo base contiene todas las características y comportamientos compartidos entre los tipos derivados de él. Cree un tipo base para representar lo esencial de sus ideas sobre algunos objetos en su sistema. A partir del tipo base, derive otros tipos para expresar caminos diferentes que puede realizar esa parte común. 7 ✐ ✐ ✐ ✐

✐<br />

✐<br />

✐<br />

“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 6 — #44<br />

✐<br />

Capítulo 1. Introducción a los Objetos<br />

ría cambiar la implem<strong>en</strong>tación interna de la clase sin preocuparse de cómo afectará<br />

a los programadores cli<strong>en</strong>tes. Por ejemplo, podría implem<strong>en</strong>tar una clase particular<br />

de una manera s<strong>en</strong>cilla para un desarrollo fácil, y más tarde descubrir que necesita<br />

reescribirla para hacerla más rápida. Si la interfaz y la implem<strong>en</strong>tación están claram<strong>en</strong>te<br />

separadas y protegidas, puede lograrlo fácilm<strong>en</strong>te y sólo requiere que el<br />

usuario vuelva a <strong>en</strong>lazar la aplicación.<br />

<strong>C++</strong> utiliza tres palabras reservadas explícitas para poner límites <strong>en</strong> una clase:<br />

public, private, y protected. Su uso y significado son bastante s<strong>en</strong>cillos. Estos<br />

especificadores de acceso determinan quién puede usar las definiciones que sigu<strong>en</strong>. public<br />

significa que las definiciones posteriores están disponibles para cualquiera. La<br />

palabra reservada private, por otro lado, significa que nadie puede acceder a estas<br />

definiciones excepto el creador del tipo, es decir, los métodos internos de la clase. p-<br />

rivate es una pared <strong>en</strong>tre el creador de la clase y el programador cli<strong>en</strong>te. Si algui<strong>en</strong><br />

int<strong>en</strong>ta acceder a un miembro privado, obt<strong>en</strong>drá un error al compilar. protected<br />

actúa como private, con la excepción de que las clases derivadas ti<strong>en</strong><strong>en</strong> acceso a<br />

miembros protegidos, pero no a los privados. La her<strong>en</strong>cia se explicará <strong>en</strong> breve.<br />

1.4. Reutilizar la implem<strong>en</strong>tación<br />

Una vez que una clase se ha creado y probado, debería constituir (idealm<strong>en</strong>te)<br />

una unidad útil de código. Sin embargo, esta reutilización no es tan fácil de conseguir<br />

como muchos esperarían; producir un bu<strong>en</strong> diseño requiere experi<strong>en</strong>cia y conocimi<strong>en</strong>tos.<br />

Pero una vez que lo ti<strong>en</strong>e, pide ser reutilizado. El código reutilizado es<br />

una de las mejores v<strong>en</strong>tajas de los l<strong>en</strong>guajes para programación ori<strong>en</strong>tada a objetos.<br />

La forma más fácil de reutilizar una clase es precisam<strong>en</strong>te utilizar un objeto de<br />

esa clase directam<strong>en</strong>te, pero también puede colocar un objeto de esta clase d<strong>en</strong>tro<br />

de una clase nueva. Podemos llamarlo «crear un objeto miembro». Su nueva clase<br />

puede estar compuesta de varios objetos de cualquier tipo, <strong>en</strong> cualquier combinación<br />

que necesite para conseguir la funcionalidad deseada <strong>en</strong> su nueva clase. Como<br />

está componi<strong>en</strong>do una nueva clase a partir de clases exist<strong>en</strong>tes, este concepto se llama<br />

composición (o de forma más g<strong>en</strong>eral, agregación). A m<strong>en</strong>udo nos referimos a la<br />

composición como una relación «ti<strong>en</strong>e-un», como <strong>en</strong> «un coche ti<strong>en</strong>e-un motor».<br />

Coche<br />

Motor<br />

Figura 1.2: Un coche ti<strong>en</strong>e un motor<br />

(El diagrama UML anterior indica composición con el rombo rell<strong>en</strong>o, lo cual implica<br />

que hay un coche. Típicam<strong>en</strong>te usaré una forma más simple: sólo una línea, sin<br />

el rombo, para indicar una asociación. 5 )<br />

La composición es un mecanismo muy flexible. Los objetos miembro de su nueva<br />

clase normalm<strong>en</strong>te son privados, haciéndolos inaccesibles para los programadores<br />

cli<strong>en</strong>tes que están usando la clase. Eso permite cambiar esos miembros sin perturbar<br />

al código cli<strong>en</strong>te exist<strong>en</strong>te. También puede cambiar los miembros del objeto <strong>en</strong> tiem-<br />

5 Normalm<strong>en</strong>te esto es sufici<strong>en</strong>te para la mayoría de los diagramas y no necesita especificar si está<br />

usando agregación o composición.<br />

6<br />

✐<br />

✐<br />

✐<br />

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!