13.01.2015 Views

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

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

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

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

✐<br />

✐<br />

✐<br />

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

✐<br />

14.10. Upcasting<br />

ciones miembros (y redefini<strong>en</strong>do las funciones exist<strong>en</strong>tes durante la her<strong>en</strong>cia) puede<br />

dejar el código exist<strong>en</strong>te - por otro que todavía se esta usando - que algui<strong>en</strong> todavía<br />

lo este utilizando. Si ocurre algún error, ahora sabe donde esta el nuevo código, y<br />

<strong>en</strong>tonces podrá leerlo mas rápido y fácilm<strong>en</strong>te que si lo hubiera modificado <strong>en</strong> el<br />

cuerpo del código exist<strong>en</strong>te.<br />

Es sorpr<strong>en</strong>d<strong>en</strong>te como las clases son limpiam<strong>en</strong>te separadas. Incluso no es necesario<br />

añadir el código fu<strong>en</strong>te con funciones miembros para reutilizar el código,<br />

solam<strong>en</strong>te el fichero de cabecera describi<strong>en</strong>do la clase y el fichero objeto o el fichero<br />

de librería con las funciones miembros compiladas. (Esto es válido tanto para la<br />

her<strong>en</strong>cia como para la composición.)<br />

Esto es importante para hacer que el desarrollo sea un proceso increm<strong>en</strong>tal, como<br />

el apr<strong>en</strong>dizaje de una persona. Puede hacer tantos análisis como desee pero todavía<br />

no sabrá todas las respuestas cuando configure un proyecto. T<strong>en</strong>drá más éxito y un<br />

progresión inmediata - si su proyecto empieza a crecer como una criatura orgánica,<br />

evolutiva, parecerá mas bi<strong>en</strong> que esa construy<strong>en</strong>do algo como un rascacielos de<br />

cristal [52]<br />

Sin embargo la her<strong>en</strong>cia es una técnica útil para la experim<strong>en</strong>tación, <strong>en</strong> algún<br />

punto donde las cosas están estabilizadas, necesita echar un nuevo vistazo a la jerarquía<br />

de clases para colapsarla d<strong>en</strong>tro de una estructura s<strong>en</strong>sible [53]. Recuerde que,<br />

por <strong>en</strong>cima de todo, la her<strong>en</strong>cia significa expresar una relación que dice "Esta nueva<br />

clase es un tipo de esta vieja". Su programa no debe preocuparse de cómo mueve<br />

pedazos de bits por alrededor, <strong>en</strong> vez debe crear y manipular objetos de varios tipos<br />

para expresar un modelo <strong>en</strong> los términos dados para su problema.<br />

14.10. Upcasting<br />

Anteriorm<strong>en</strong>te <strong>en</strong> este capitulo, observo como un objeto de una clase que derivaba<br />

de ifstream t<strong>en</strong>ia todas las características y conductas de un objeto ifstream. En<br />

FName2.cpp, cualquier función miembro de ifstream podría ser llamada por cualquier<br />

objeto FName2.<br />

El aspecto más importante de la her<strong>en</strong>cia no es proporcionar nuevas funciones<br />

miembro a la nueva clase. Es la relación expresada <strong>en</strong>tre la nueva clase y la clase<br />

base. Esta relación puede ser resumida dici<strong>en</strong>do "La nueva clase es de un tipo de<br />

una clase exist<strong>en</strong>te".<br />

Esta no es una descripción fantasiosa de explicar la her<strong>en</strong>cia - esta directam<strong>en</strong>te<br />

soportada por el compilador. Un ejemplo, considere una clase base llamada Instrum<strong>en</strong>t<br />

que repres<strong>en</strong>ta instrum<strong>en</strong>tos musicales y una clase derivada llamada Wind.<br />

Dado que la her<strong>en</strong>cia significa que todas las funciones <strong>en</strong> la clase base están también<br />

disponibles <strong>en</strong> la clase derivada, cualquier m<strong>en</strong>saje que <strong>en</strong>vié a la clase base puede<br />

ser también <strong>en</strong>viado desde la derivada. Entonces si la clase Instrum<strong>en</strong>t ti<strong>en</strong>e una<br />

función miembro play(), también existirá <strong>en</strong> los instrum<strong>en</strong>tos de Wind. Esto significa<br />

precisam<strong>en</strong>te que un objeto Wind es un tipo de Instrum<strong>en</strong>t. El sigui<strong>en</strong>te ejemplo<br />

muestra como el compilador soporta esta idea:<br />

//: C14:Instrum<strong>en</strong>t.cpp<br />

// Inheritance & upcasting<br />

<strong>en</strong>um note { middleC, Csharp, Cflat }; // Etc.<br />

class Instrum<strong>en</strong>t {<br />

public:<br />

void play(note) const {}<br />

425<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!