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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

✐<br />

✐<br />

✐<br />

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

✐<br />

Capítulo 14. Her<strong>en</strong>cia y Composición<br />

Una segunda manera es añadir la definición Close() a FName1:<br />

void close() { file.close(); }<br />

Esto funcionará si sólo exist<strong>en</strong> unas cuantas funciones a las que se desea hacer<br />

funcionar como una clase ifstream. En este caso, solo una parte de la clase y la composición<br />

apropiada.<br />

Pero ¿qué ocurre si se quiere que todo funcione cómo la clase deseada A eso se le<br />

llama subtipos porque esta creando un nuevo tipo desde uno ya exist<strong>en</strong>te y lo que se<br />

quiere es que el nuevo tipo t<strong>en</strong>ga la misma interfaz que el tipo exist<strong>en</strong>te (además de<br />

otras funciones que se dese<strong>en</strong> añadir) para que se pueda utilizar <strong>en</strong> cualquier lugar<br />

donde se utilizaba el tipo exist<strong>en</strong>te. Aquí es dónde la her<strong>en</strong>cia es es<strong>en</strong>cial. Puede ver<br />

que el subtipo resuelve perfectam<strong>en</strong>te el problema anterior:<br />

//: C14:FName2.cpp<br />

// Subtyping solves the problem<br />

#include "../require.h"<br />

#include <br />

#include <br />

#include <br />

using namespace std;<br />

class FName2 : public ifstream {<br />

string fileName;<br />

bool named;<br />

public:<br />

FName2() : named(false) {}<br />

FName2(const string& fname)<br />

: ifstream(fname.c_str()), fileName(fname) {<br />

assure(*this, fileName);<br />

named = true;<br />

}<br />

string name() const { return fileName; }<br />

void name(const string& newName) {<br />

if(named) return; // Don’t overwrite<br />

fileName = newName;<br />

named = true;<br />

}<br />

};<br />

int main() {<br />

FName2 file("FName2.cpp");<br />

assure(file, "FName2.cpp");<br />

cout

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

Saved successfully!

Ooh no, something went wrong!