HERENCIA Y POLIFORMISMO

Embed Size (px)

Citation preview

HERENCIA Y POLIFORMISMO

HERENCIA La Herencia es el mecanismo por el que se crean nuevos objetos definidos en trminos de objetos ya existentes. Por ejemplo, si se tiene la clase Ave, se puede crear la subclase Pato, que es una especializacin de Ave. class Pato extends Ave { int numero_de_patas; } La palabra clave extend se usa para generar una subclase (especializacin) de un objeto. Una Pato es una subclase de Ave. Cualquier cosa que contenga la definicin de Ave ser copiada a la clase Pato, adems, en Pato se pueden definir sus propios mtodos y variables de instancia. Se dice que Pato deriva o hereda de Ave. Adems, se pueden sustituir los mtodos proporcionados por la clase base. Utilizando nuestro anterior ejemplo de Mi Clase, aqu hay un ejemplo de una clase derivada sustituyendo a la funcin Suma_a_i():

el polimorfismo se refiere a la capacidad para que varias clases derivadas de una antecesora utilicen un mismo mtodo de forma diferente. Por ejemplo, podemos crear dos clases distintas: Pez y Ave que heredan de la superclase Animal. La clase Animal tiene el mtodo abstracto mover que se implementa de forma distinta en cada una de las subclases (peces y aves se mueven de forma distinta). Como se mencion anteriormente, el concepto de polimorfismo se puede aplicar tanto a funciones como a tipos de datos. As nacen los conceptos de funciones polimrficas y tipos polimrficos. Las primeras son aquellas funciones que pueden evaluarse o ser aplicadas a diferentes tipos de datos de forma indistinta; los tipos polimrficos, por su parte, son aquellos tipos de datos que contienen al menos un elemento cuyo tipo no est especificado.

Polimorfismo dinmico (o polimorfismo paramtrico) es aqul en el que el cdigo no incluye ningn tipo de especificacin sobre el tipo de datos sobre el que se trabaja. As, puede ser utilizado a todo tipo de datos compatible. Polimorfismo esttico (o polimorfismo ad hoc) es aqul en el que los tipos a los que se aplica el polimorfismo deben ser explicitados y declarados uno por uno antes de poder ser utilizados.

Diferencias entre polimorfismo y sobrecarga El polimorfismo como se muestra en el ejemplo anterior, suele ser bastante ventajoso aplicado desde las interfaces, ya que permite crear nuevos tipos sin necesidad de tocar las clases ya existentes (imaginemos que deseamos aadir una clase Multiplicar), basta con recompilar todo el cdigo que incluye los nuevos tipos aadidos. Si se hubiera recurrido a la sobrecarga durante el diseo exigira retocar la clase anteriormente creada al aadir la nueva operacin Multiplicar, lo que adems podra suponer revisar todo el cdigo donde se instancia a la clase. La sobrecarga se da siempre dentro de una sola clase, mientras que el polimorfismo se da entre clases distintas. Un mtodo est sobrecargado si dentro de una clase existen dos o ms declaraciones de dicho mtodo con el mismo nombre pero con parmetros distintos, por lo que no hay que confundirlo con polimorfismo. En definitiva: La sobrecarga se resuelve en tiempo de compilacin utilizando los nombres de los mtodos y los tipos de sus parmetros; el polimorfismo se resuelve en tiempo de ejecucin del programa, esto es, mientras se ejecuta, en funcin de que clase pertenece un objeto.

LA CLASE DERIVADA

Incrementamos la funcionalidad de la clase Ventana definiendo una clase derivada denominada Ventana Titulo. Los objetos de dicha clase tendrn todas las caractersticas de los objetos de la clase base, pero adems tendrn un ttulo, y se podran desplazar (se simula el desplazamiento de una ventana con el ratn). La clase derivada heredar los miembros dato de la clase base y las funciones miembro, y tendr un miembro dato ms, el ttulo de la ventana

En la clase derivada se define una funcin que tiene el mismo nombre y los mismos parmetros que la de la clase base. Se dice que redefinimos la funcin mostrar en la clase derivada. La funcin miembro mostrar de la clase derivada Ventana Titulo hace una llamada a la funcin mostrar de la clase base Ventana, mediante super.mostrar(); De este modo aprovechamos el cdigo ya escrito, y le aadimos el cdigo que describe la nueva funcionalidad de la ventana por ejemplo, que muestre el ttulo. Si nos olvidamos de poner la palabra reservada super llamando a la funcin mostrar, tendramos una funcin recursiva. La funcin mostrar llamara a mostrar indefinidamente.

public class Ventana Titulo extends Ventana{ protected String titulo; public Ventana Titulo(int x, int y, int w, int h, String nombre) { super(x, y, w, h); titulo=nombre; } public void mostrar(){ super.mostrar(); System.out.println(titulo : +titulo); } public void desplazar(int dx, int dy){ x+=dx; y+=dy; } }

La clase base ventana: Ventana.java, VentanaTitulo.java, VentanaApp.java Vamos a poner un ejemplo del segundo tipo, que simule la utilizacin de liberas de clases para crear un interfaz grfico de usuario como Windows 3.1 o Windows 95. Supongamos que tenemos una clase que describe la conducta de una ventana muy simple, aquella que no dispone de ttulo en la parte superior, por tanto no puede desplazarse, pero si cambiar de tamao actuando con el ratn en los bordes derecho e inferior.

LA CLASE VENTANA

La clase Ventana tendr los siguientes miembros dato: la posicin x e y de la ventana, de su esquina superior izquierda y las dimensiones de la ventana: ancho y alto.

Las funciones miembros, adems del constructor sern las siguientes: la funcin mostrar que simula una ventana en un entorno grfico, aqu solamente nos muestra la posicin y las dimensiones de la ventana. public void mostrar(){ System.out.println("posicin : x="+x+", y="+y); System.out.println("dimensiones : w="+ancho+", h="+alto); }

Objetos de la clase base Como vemos en el cdigo, el constructor de la clase base inicializa los cuatro miembros dato. Llamamos al constructor creando un objeto de la clase Ventana

CLASES DERIVADAS.

En C++, la herencia simple se realiza tomando una clase existente y derivando nuevas clases de ella. La clase derivada hereda las estructuras de datos y funciones de la clase original. Adems, se pueden aadir nuevos miembros a las clases derivadas y los miembros heredados pueden ser modificados. Una clase utilizada para derivar nuevas clases se denomina clase base, clase padre, superclase o ascendiente. Una clase creada de otra clase se denomina clase derivada o subclase. Se pueden construir jerarquas de clases, en las que cada clase sirve como padre o raz de una nueva clase. Conceptos fundamentales de derivacin C++ utiliza un sistema de herencia jerrquica. Es decir, se hereda una clase de otra, creando nuevas clases a partir de las clases ya existentes. Slo se pueden heredar clases, no funciones ordinarias n variables, en C++. Una clase derivada hereda todos los miembros dato excepto, miembros dato esttico, de cada una de sus clases base. Una clase derivada hereda la funcin miembro de su clase base. Esto significa que se hereda la capacidad para llamar a funciones miembro de la clase base en los objetos de la clase derivada. Los siguientes elementos de la clase no se heredan:

CREACIN DE UNA CLASE DERIVADA

Cada clase derivada se debe referir a una clase base declarada anteriormente. La declaracin de una clase derivada tiene la siguiente sintaxis: Class clase_derivada: clase_base {...}; Los especificadotes de acceso pueden ser: public, protected o private.

Clases de derivacin Los especificadores de acceso a las clases base definen los posibles tipos de derivacin: public, protected y private. El tipo de acceso a la clase base especifica cmo recibir la clase derivada a los miembros de la clase base. Si no se especifica un acceso a la clase base, C++ supone que su tipo de herencia es privado. - Derivacin pblica (public). Todos los miembros public y protected de la clase base son accesibles en la clase derivada, mientras que los miembros private de la clase base son siempre inaccesibles en la clase derivada. - Derivacin privada (private). Todos los miembros de la clase base se comportan como miembros privados de la clase derivada. Esto significa que los miembros public y protected de la clase base no son accesibles ms que por las funciones miembro de la clase derivada. Los miembros privados de la clase siguen siendo inaccesibles desde la clase derivada. - Derivacin protegida (protected). Todos los miembros public y protected de la clase base se comportan como miembros protected de la clase derivada. Estos miembros no son, pues, accesibles al programa exterior, pero las clases que se deriven a continuacin podrn acceder normalmente a estos miembros (datos o funciones).

CLASES ABSTRACTAS

La abstraccin es un recurso de la mente (quizs el ms caracterstico de nuestra pretendida superioridad respecto del mundo animal). Por su parte, los lenguajes de programacin permiten expresar la solucin de un problema de forma comprensible simultneamente por la mquina y el humano. Constituyen un puente entre la abstraccin de la mente y una serie de instrucciones ejecutables por un dispositivo electrnico. En consecuencia, la capacidad de abstraccin es una caracterstica deseable de los lenguajes artificiales, pues cuanto mayor sea, mayor ser su aproximacin al lado humano. Es decir, con la imagen existente en la mente del programador. En este sentido, la introduccin de las clases en los lenguajes orientados a objetos ha representado un importante avance respecto de la programacin tradicional y dentro de ellas, las denominadas clases abstractas son las que representan el mayor grado de abstraccin.

Una clase abstracta es la que tiene al menos una funcin virtual pura (como hemos visto, una funcin virtual es especificada como "pura" hacindola igual a cero 4.11.8a). Nota: recordemos que las clases que tienen al menos una funcin virtual (o virtual pura) se denominan clases polimrficas ( 4.11.8). Resulta por tanto, que todas las clases abstractas son tambin polimrficas, pero no necesariamente a la inversa.

Una clase abstracta solo puede ser usada como clase base para otras clases, pero no puede ser instanciada para crear un objeto 1. Una clase abstracta no puede ser utilizada como argumento o como retorno de una funcin 2. Si puede declararse punteros-a-clase abstracta 3 [1]. Se permiten referencias-a-clase abstracta, suponiendo que el objeto temporal no es necesario en la inicializacin 4.

class Figura { // clase abstracta (CA) point centro; ... public: getcentro() { return center; } mover(point p) { centro = p; dibujar(); } virtual void rotar(int) = 0; // funcin (mtodo) virtual pura virtual void dibujar() = 0; // funcin (mtodo) virtual pura void brillo(int); // mtodo normal -definicin off-line... }; ... Figura x; // ERROR: intento de instanciar una CA.1 Figura* sptr; // Ok: puntero a CA. 3 Figura f(); // ERROR: funcin NO puede devolver tipo CA. 2 int g(Figura s); // ERROR: CA NO puede ser argumento de funcin 2 Figura& h(Figura&); // Ok: devuelve tipo "referencia-a-CA" 4 int h(Figura&); // Ok: "referencia-a-CA" si puede ser argumento 4

Las clases abstractas no sirven para instanciar objetos porque estn incompletas, siendo sus clases derivadas las que debern definir las partes faltantes. El propsito de una clase abstracta es proveer una clase base apropiada desde la cual otras clases hereden. Las clases desde las cuales se pueden instanciar objetos se llaman clases concretas. Tales clases proveen implementaciones de cada mtodo o propiedad que definen. Las clases abstractas normalmente contienen uno o ms mtodos o propiedades abstractas, las cuales no proveen implementacin. Las clases derivadas deben reemplazar los mtodos abstractos heredados para permitir la instanciacin de objetos.

DEFINICION DE CLASE ABSTRACTA Para definir una clase abstracta se utiliza la palabra clave abstract (que tambin sirve para definir mtodos y propiedades abstractos). Ejemplo : // Clase abstracta con mtodos abstractos; abstract class Figura { protected int x, y ; public abstract double daPermetro( ) ; // Declaracin de un mtodo abstracto. public abstract double daArea( ) ; // Declaracin de un mtodo abstracto. } Intentar construir objetos de la clase Figura producir un error de compilacin.

Ejemplo 1: // Clase abstracta con mtodos abstractos, y una clase derivada que // tiene mtodos que reemplazan a los mtodos abstractos heredados. abstract class Figura { protected int x, y ; // Declaracin de 2 mtodos abstractos. public abstract double daPermetro( ) ; public abstract double daArea( ) ; } class Rectngulo : Figura { double b, a ; public Rectngulo(int m, int n, double s,double t) { x=m; y=n; b=s; a=t; }

HERENCIA MULTIPLE

Herencia mltiple hace referencia a una caracterstica de los lenguajes de programacin orientada a objetos en la que una clase puede heredar comportamientos y caractersticas de ms de una superclase. Esto contrasta con la herencia simple, donde una clase slo puede heredar de una superclase. Lenguajes que soportan herencia mltiple en su mayor parte son: C++, Centura SQL Windows, CLOS, Eiffel, Object REXX, Perl y Python. La herencia mltiple permite a una clase tomar funcionalidades de otras clases, como permitir a una clase llamada MusicoEstudiante heredar de una clase llamada Persona, una clase llamada Msico, y una clase llamada Trabajador. Esto puede ser abreviado como MusicoEstudiante : Persona, Msico, Trabajador.

En la herencia mltiple aparecen ambigedades, como en el ejemplo de encima: si la clase Msico heredaba de Persona y Trabajador, y la clase Trabajador heredaba de Persona. Existiran las siguientes reglas:: MusicoEstudiante : Persona, Msico, Trabajador Msico : Persona, Trabajador Trabajador: Persona

DECLARACIN POR HERENCIA MLTIPLE

La tercera forma de crear una nueva clase es por herencia mltiple, tambin llamada agregacin o composicin [1]. Consiste en el ensamblando una nueva clase con los elementos de varias clasesbase. C++ permite crear clases derivadas que heredan los miembros de una o ms clases antecesoras. Es clsico sealar el ejemplo de un coche, que tiene un motor; cuatro ruedas; cuatro amortiguadores, etc. Elementos estos pertenecientes a la clase de los motores, de las ruedas, los amortiguadores, etc. Como en el caso de la herencia simple, aparte de los miembros heredados de cada clase antecesora, la nueva clase tambin puede tener miembros privativos ( 4.11.2b) 2 Sintaxis Cuando se declara una clase D derivada de varias clases base: B1, B2, ... se utiliza una lista de las bases directas ( 4.11.2b) separadas por comas. La sintaxis general es: class-key nomb-clase { };

La herencia mltiple puede originar situaciones de ambigedad cuando una subclase contiene versiones duplicadas de sub-objetos de clases antecesoras o cuando clases antecesoras contienen miembros del mismo nombre: Clases genricas Las clases genricas encapsulan operaciones que no son especficas de un tipo de datos concreto. El uso ms comn de las clases genricas se da con las colecciones, como listas vinculadas, tablas hash, pilas, colas, rboles, etc., en las que las operaciones tales como agregar y quitar elementos de la coleccin se realizan de forma similar independientemente del tipo de datos que se almacena.

Las clases genricas encapsulan operaciones que no son especficas de un tipo de datos concreto. El uso ms comn de las clases genricas se da con las colecciones, como listas vinculadas, tablas hash, pilas, colas, rboles, etc., en las que las operaciones tales como agregar y quitar elementos de la coleccin se realizan de forma similar independientemente del tipo de datos que se almacena. En la mayora de los escenarios que necesitan clases de coleccin, el enfoque recomendado es utilizar las que proporciona la biblioteca de clases de .NET Framework 2.0. Para obtener ms informacin acerca del uso de estas clases, vea Tipos genricos en la biblioteca de clases de .NET Framework (Gua de programacin de C#).

El mtodo de fichero nico exige que el compilador encuentre la definicin de las plantillas antes de su uso en cada unidad de compilacin. Presenta el inconveniente de que las plantillas definidas en un mdulo no son visibles desde los dems. Responde al siguiente esquema:

template class C1 { // declaracin/definicin ... // definicion... }; ... int main() { ... C1 c1; ... }

// uso de una instancia

El mtodo de fichero combinado consiste en situar en un fichero de cabecera las definiciones de todas las clases genricas (y de sus funciones-miembro). Posteriormente este fichero es incluido en todos los mdulos que utilicen la clase genrica. La situacin queda esquematizada como sigue: // cabecera.h

ARCHIVOS DE TEXTO Los archivos de texto plano son aquellos que estan compuestos unicamente por texto sin formato, solo caracteres. estos caracteres se pueden codificar de ditintos modos dependiendo de la lengua usada. Se les conoce tambien como archivos de texto llano o texto simple por carecer de informacion destinada a generar fromatos y tipos de letra. ARCHIVOS BINARIO Un archivo binario es una rchivo informatico que contiene informacion de cualquier tipo, codificada en forma binaria para el proposito de almacenamiento y procesamiento de ordenadores. Por ejemplo los archivos informaticos que almacenan texto formateado o fotografias.

Muchos formatos binarios contienen partes que pueden ser interpretados como texto. Un archivo binario que solo contiene informacion de tipo textual sin informacion sobre el formato del mismo, se dice que es un archivo de texto plano. Habitualmente se contraponen los terminos archivo binario y archivo de texto de forma que los primeros no contienen solamnete texto. En informtica, un archivo es un grupo de datos estructurados que son almacenados en algn medio y pueden ser usados por las aplicaciones. La forma en que una computadora organiza, da nombre, almacena y manipula los archivos se denominasistema de archivos y suele depender del sistema operativo y del medio de almacenamiento (disco duro, disco ptico, etc).

ARCHIVOS DE TEXTO

Los archivos de texto plano son aquellos que estan compuestos unicamente por texto sin formato, solo caracteres. estos caracteres se pueden codificar de ditintos modos dependiendo de la lengua usada. Se les conoce tambien como archivos de texto llano o texto simple por carecer de informacion destinada a generar fromatos y tipos de letra. ARCHIVOS BINARIO Un archivo binario es una rchivo informatico que contiene informacion de cualquier tipo, codificada en forma binaria para el proposito de almacenamiento y procesamiento de ordenadores. Por ejemplo los archivos informaticos que almacenan texto formateado o fotografias. Muchos formatos binarios contienen partes que pueden ser interpretados como texto. Un archivo binario que solo contiene informacion de tipo textual sin informacion sobre el formato del mismo, se dice que es un archivo de texto plano. Habitualmente se contraponen los terminos archivo binario y archivo de texto de forma que los primeros no contienen solamnete texto. En informtica, un archivo es un grupo de datos estructurados que son almacenados en algn medio y pueden ser usados por las aplicaciones. La forma en que una computadora organiza, da nombre, almacena y manipula los archivos se denominasistema de archivos y suele depender del sistema operativo y del medio de almacenamiento (disco duro, disco ptico, etc).

Archivos de texto. El manejo de archivos de texto se puede llevar a cabo por medio de dos tipos de flujos: de bytes y de caracteres . Archivos de Texto con Flujos de Bytes. Para escribir o leer datos de tipo byte en un archivo se declara un flujo de la clase FileStream , cuyos constructores son: FileStream (string nombre , FileMode modo ) FileStream (string nombre , FileMode modo , FileAccess acceso ) donde: nombre es el nombre del archivo en disco, incluyendo la trayectoria.

Valor Accin CreateNew Crea un nuevo archivo. Si el archivo existe, lanzar una excepcin del tipo IOException. Create Crea un nuevo archivo. Si el archivo existe, ser sobreescrito. Open Abre un archivo existente. OpenOrCreate Abre un archivo, si existe;en caso contrario, se crea un nuevo archivo. Truncate Abre un archivo existente y lo trunca a cero bytes de longitud. Append Abre un archivo para agregarle datos al final.Si el archivo no existe, lo crea.

Valor Accin Read Permite leer un archivo. ReadWrite Permite leer o escribir en el archivo. Write permite escribir en el archivo.

Ficheros El estndar de C contiene funciones varias para la edicin de ficheros, estas estn definidas en la cabecera stdio.h y por lo general empiezan con la letra f, haciendo referencia a file. Adicionalmente se agrega un tipo FILE, el cual se usar como apuntador a la informacin del fichero. La secuencia que usaremos para realizar operaciones ser la siguiente: Crear un apuntador del tipo FILE * [editar]fopen Esta funcin sirve para abrir y crear ficheros en disco. El prototipo correspondiente de fopen es: FILE * fopen (const char *filename, const char *opentype);

fopen Esta funcin sirve para abrir y crear ficheros en disco. El prototipo correspondiente de fopen es: FILE * fopen (const char *filename, const char *opentype); Los parmetros de entrada de fopen son: filename: una cadena que contiene un nombre de fichero vlido. opentype: especifica el tipo de fichero que se abrir o se crear.Una lista de parmetros opentype para la funcin fopen son: "r" : abrir un archivo para lectura, el fichero debe existir. "w" : abrir un archivo para escritura, se crea si no existe o se sobreescribe si existe. "a" : abrir un archivo para escritura al final del contenido, si no existe se crea. "r+" : abrir un archivo para lectura y escritura, el fichero debe existir. "w+" : crear un archivo para lectura y escritura, se crea si no existe o se sobreescribe si existe. "a+" : abrir/crear un archivo para lectura y escritura al final del contenido

fclose Esta funcin sirve para poder cerrar un fichero que se ha abierto. El prototipo correspondiente de fclose es: int fclose (FILE *stream); Un valor de retorno cero indica que el fichero ha sido correctamente cerrado, si ha habido algn error, el valor de retorno es la constante EOF. Un ejemplo pequeo para abrir y cerrar el archivo llamado fichero.in en modo lectura: #include int main(int argc, char** argv) { FILE *fp; fp = fopen ( "fichero.in", "r" ); fclose ( fp ); return 0;

}

feof Esta funcin sirve para determinar si el cursor dentro del archivo encontr el final (end of file). Existe otra forma de verificar el final del archivo que es comparar el caracter que trae fgetc del archivo con el macro EOF declarado dentro de stdio.h, pero este mtodo no ofrece la misma seguridad (en especial al tratar con los archivos "binarios"). La funcin feof siempre devolver cero (Falso) si no es encontrado EOF en el archivo, de lo contrario regresar un valor distinto de cero (Verdadero). El prototipo correspondiente de feof es: int feof(FILE *fichero);

rewind Literalmente significa "rebobinar", sita el cursor de lectura/escritura al principio del archivo. El prototipo correspondiente de rewind es: void rewind(FILE *fichero); [editar]Lectura Un archivo generalmente debe verse como un string (una cadena de caracteres) que esta guardado en el disco duro. Para trabajar con los archivos existen diferentes formas y diferentes funciones. Las funciones que podramos usar para leer un archivo son: char fgetc(FILE *archivo) char *fgets(char *buffer, int tamano, FILE *archivo) size_t fread(void *puntero, size_t tamano, size_t cantidad, FILE *archivo); int fscanf(FILE *fichero, const char *formato, argumento, ...);

fgetc Esta funcin lee un caracter a la vez del archivo que esta siendo sealado con el puntero *archivo. En caso de que la lectura sea exitosa devuelve el caracter ledo y en caso de que no lo sea o de encontrar el final del archivo devuelve EOF. El prototipo correspondiente de fgetc es: char fgetc(FILE *archivo);

fgets Esta funcin est diseada para leer cadenas de caracteres. Leer hasta n-1 caracteres o hasta que lea un retorno de lnea. En este ltimo caso, el carcter de retorno de lnea tambin es ledo. El prototipo correspondiente de fgets es: char *fgets(char *buffer, int tamao, FILE *archivo); fread size_t fread ( void * ptr, size_t size, size_t count, FILE * stream ); Esta funcin lee un bloque de una "stream" de datos. Efecta la lectura de un arreglo de elementos "count", cada uno de los cuales tiene un tamao definido por "size". Luego los guarda en el bloque de memoria especificado por "ptr". El indicador de posicin de la cadena de caracteres avanza hasta leer la totalidad de bytes. Si esto es exitoso la cantidad de bytes ledos es (size*count).

fscanf La funcin fscanf funciona igual que scanf en cuanto a parmetros, pero la entrada se toma de un fichero en lugar del teclado. El prototipo correspondiente de fscanf es: int fscanf(FILE *fichero, const char *formato, argumento, ...); Podemos ver un ejemplo de su uso, abrimos el documento "fichero.txt" en modo lectura y leyendo dentro de el. #include

fputc Esta funcin escribe un carcter a la vez del archivo que esta siendo sealado con el puntero *archivo. El valor de retorno es el carcter escrito, si la operacin fue completada con xito, en caso contrario ser EOF. El prototipo correspondiente de fputc es: int fputc(int carcter, FILE *archivo); Mostramos un ejemplo del uso de fputc en un "fichero.txt", se escribira dentro del fichero hasta que presionemos la tecla enter. fwrite Esta funcin est pensada para trabajar con registros de longitud constante y forma pareja con fread. Es capaz de escribir hacia un fichero uno o varios registros de la misma longitud almacenados a partir de una direccin de memoria determinada. El valor de retorno es el nmero de registros escritos, no el nmero de bytes. Los parmetros son: un puntero a la zona de memoria de donde se obtendrn los datos a escribir, el tamao de cada registro, el nmero de registros a escribir y un puntero a la estructura FILE del fichero al que se har la escritura. El prototipo correspondiente de fwrite es: size_t fwrite(void *puntero, size_t tamano, size_t cantidad, FILE *archivo);

fprintf La funcin fprintf funciona igual que printf en cuanto a parmetros, pero la salida se dirige a un archivo en lugar de a la pantalla. El prototipo correspondiente de fprintf es: int fprintf(FILE *archivo, const char *formato, argumento, ...); Podemos ver un ejemplo de su uso, abrimos el documento "fichero.txt" en modo lectura/escritura y escribimos dentro de el. #include int main ( int argc, char **argv ) { FILE *fp; char buffer[100] = "Esto es un texto dentro del fichero.";

fp = fopen ( "fichero.txt", "r+" );fprintf(fp, buffer); fprintf(fp, "%s", "\nEsto es otro texto dentro del fichero."); fclose ( fp ); return 0; }

EXEPCION

Una excepcin es un objeto que cuenta con campos que describen las causas del error y a cuyo tipo suele drsele un nombre que resuma claramente su causa. Por ejemplo, para informar errores de divisin por cero se suele utilizar una excepcin predefinida de tipo DivideByZeroException en cuyo campo Message se detallan las causas del error producido. Cuando se usan excepciones siempre se asegura que el programador trate toda excepcin que pueda producirse o que, si no lo hace, se aborte la ejecucin de la aplicacin mostrndose un mensaje indicando dnde se ha producido el error.

Tipo de excepcin Causa que produce la excepcin FormatException Se produce cuando el formato de un argumento no cumple las especificaciones de los parmetros del mtodo invocado. DivideByZeroException Cuando se divide entre cero IndexOutOfRangeException Se genera cuando se intenta tener acceso a un elemento de un arreglo con un ndice que est fuera de los lmites del arreglo. OverflowException Desbordamiento dentro de contexto donde se ha de comprobar los desbordamientos (expresin constante, instruccin checked, operacin checked u opcin del compilador /checked) ArgumentException Pasado argumento no vlido (base de excepciones de argumentos) ArgumentNullException Pasado argumento nulo ArgumentOutOfRangeException Pasado argumento fuera de rango

ArrayTypeMistmatchException Asignacin a tabla de elemento que no es de su tipo COMException Excepcin de objeto COM InvalidCastException Conversin explcita entre tipos no vlida InvalidOperationException Operacin invlida en estado actual del objeto InteropException Base de excepciones producidas en comunicacin con cdigo inseguro NullReferenceException Acceso a miembro de objeto que vale null OutOfMemoryException Falta de memoria para crear un objeto con new SEHException Excepcin SHE del API Win32 StackOverflowException Desbordamiento de la pila, generalmente debido a un excesivo nmero de llamadas recurrentes. TypeInizializationException Ha ocurrido alguna excepcin al inicializar los campos estticos o el constructor esttico de un tipo. En InnerException se indica cul es.

try-catch-finally Un uso comn de catch y finally consiste en obtener y utilizar recursos en un bloque try, tratar circunstancias excepcionales en el bloque catch y liberar los recursos en el bloque finally. Utilizamos la instruccin try para que nuestro programa intente hacer algo. Si esto no es posible, pasara a la orden Catch, sin lanzar ningn error. Una vez ejecutado con xito una orden try, o catch en caso de no poder ejecutar la orden try, pasara a la orden Finally. El manejo de excepciones es relativamente sencillo y fcil de entender aunque no tengamos mucha experiencia programando, todo aquello que se puso entre las llaves { } del try es un segmento de cdigo en el que puede o no generarse un error en tiempo de ejecucin(excepcin),

Excepciones1.cs using System; class Excepciones3 { static void Main(string[] args) { int[] array1={1,2}; int y; try { y=array1[2]; } catch (IndexOutOfRangeException) { Console.WriteLine("Error: IndexOutOfRangeException"); } finally { Console.WriteLine("Esta sentencia siempre se ejecuta"); Console.ReadLine(); } } }

Excepciones2.cs using System; class MyClass { public static void Main() { MyClass x = new MyClass(); try { string s = null; x.MyFn(s); } catch (Exception e) { Console.WriteLine("{0} Error", e); Console.ReadLine(); } } public void MyFn(string s) { if (s == null) throw (new System.ArgumentNullException()); // Lanzamos la excepcin que indica un argumento nulo. } }

ARCHIVOSArchivos En todos los programas, la manera de almacenar y recuperar informacin que perdure en el tiempo se basa en el uso de memoria secundaria, compuesta esencialmente por discos (diskettes, discos duros, CD, DVD, etc.) y ocasionalmente cintas. En cualquiera de estos medios, la unidad de almacenamiento de informacin se denomina archivo. Al igual que prcticamente todos los lenguajes de programacin, C# ofrece el acceso a leer y escribir archivos en disco, por medio de estructuras especialmente definidas. En el caso de C#, las estructuras consisten en clases de caractersticas y mtodos particulares, que resuelven la problemtica general de acceso a los archivos, permitiendo desarrollar programas que los utilicen como fuente de informacin y medio de almacenamiento de informacin de largo plazo.

STREAMSStreams Un stream es como se denomina a un objeto utilizado para transferir datos. Estos datos pueden ser transferidos en dos posibles direcciones: - Si los datos son transferidos desde una fuente externa al programa, entonces se habla de leer desde el stream. - Si los datos son transferidos desde el programa a alguna fuente externa, entonces se habla de escribir al stream. Frecuentemente, la fuente externa ser un archivo, pero eso no necesariamente es el caso, por lo que el concepto es utilizado ampliamente con fuentes de informacin externas de diversos tipos. Algunas otras posibilidades fuera de los archivos incluyen: Leer o escribir datos a una red utilizando algn protocolo de red, donde la intencin es que estos datos sean recibidos o enviados por otra computadora. Lectura o escritura a un rea de memoria. La Consola La Impresora Algunas clases que C# provee para resolver este acceso a fuentes diversas incluyen las clases de tipo Reader y Writer. 6.13 Captulo 6:Control de Excepciones y Archivos

LECTURA DE ARCHIVOSLectura de Archivos Las clases ms relacionadas con la escritura y lectura de archivos (File Input/Output o File I/O) son: - FileStream, cuyo propsito es lectura y escritura de datos binarios (no de texto legible), a cualquier archivo de tipo binario, aunque se puede utilizar para acceder a cualquier tipo de archivo, inclusive los de texto. - StreamReader y StreamWriter, las cuales estn diseadas para lectura y escritura de archivos de texto. Estas clases se asumen como de un nivel ms alto que FileStream. Una observacin acerca de la declaracin de nombres/rutas de archivos en C#. Usualmente, la ruta de un archivo contiene el carcter \, que en C# se utiliza como caracter de control para smbolos especiales (como el cambio de lnea: \n). Sin embargo, entendiendo que no es el mismo sentido el que se le quiere dar en la interpretacin de rutas de archivos (por ej: C:\Mis documentos\Programas\ejemplo.cs), se utiliza una sintaxis particular, anteponiendo el smbolo @ antes del string con la ruta del archivo. Es decir: string rutaarchivo = @"C:\Temp\archivo.txt"; Esta declaracin evita la interpretacin de los dos caracteres \ como smbolos especiales y el string queda correctamente inicializado.

Using System.IO Para el uso de estas clases, es necesario referenciar el uso del namespace System.IO, ya que System no contiene los elementos para el manejo de archivos. Por ello, los programas con acceso a archivos deben incluir la lnea: using System.IO; Control de Errores Si bien en una serie de instrucciones de ejecucin en lenguaje C# se pueden producir errores importantes, particularmente cuando hay input del usuario que debera tener cierta forma o valores, o en clculos matemticos (especficamente evitando divisiones por cero), es factible en C# tener cierto control sobre el comportamiento del programa ante dichas situaciones. 6.14 Captulo 6:Control de Excepciones y Archivos

Esencialmente, el bloque try-catch persigue precisamente tener cierto control sobre lo que el programa har en caso de producirse un error. public int division(int n1, int n2) { int resultado = 0; try { resultado = n1/n2; } catch(Exception e) { Console.WriteLine("Error en la divisin de {0}/{1}\n\n{2}",n1, n2, e.ToString()); } }

Lectura: StreamReader La ventaja de esta clase es que hace una operacin sobre archivos que resulta muy natural al momento de utilizarla. Constructores de StreamReader El ms simple de los constructores toma slo el nombre/ruta del archivo a abrir para lectura: StreamReader sr = new StreamReader(@C:\Temp\archivo.txt); Sin embargo, reconociendo que hoy existen diferentes formatos (codificaciones) de archivos de texto y no solamente el tradicional formato ASCII, es factible establecer cul es la codificacin especial que este archivo de texto plano puede tener. Los formatos posibles son: ASCII, Unicode, UTF7, UTF8, BigEndianUnicode. El constructor es: StreamReader sr = new StreamReader(@C:\Temp\file.txt, Encoding.UTF8Encoding); En trminos prcticos, nos ser necesario recurrir a este tipo de codificaciones, ya que usualmente se trabajar con codificacin ASCII. El constructor deja abierto el stream para poder recuperar la informacin del archivo desde la instancia de StreamReader declarada. Para cerrar un stream o archivo, se invoca el mtodo Close(): sr.Close(); 6.15 Captulo 6:Control de Excepciones y Archivos

Lectura con StreamReader Son bsicamente tres los mtodos propios de StreamReader que permiten efectuar lectura desde el stream (archivo) declarado. ReadLine() ReadToEnd() Este mtodo, por su parte, se encarga de acumular la informacin que hay desde la lectura anterior (que pudo haberse hecho con ReadLine(), por ejemplo) hasta el final del archivo, todo en el mismo string. string linea = sr.ReadToEnd() int SigCaracter = sr.Read(); Este mismo mtodo ofrece una declaracin alternativa (sobrecarga), donde es posible leer una cantidad especfica de caracteres y almacenarlos en un arreglo de enteros. char[] CharArray = new char[100]; int[] nChars = sr.Read(CharArray, 0, 100); nChars es un arreglo con los enteros retornados por el mtodo, y ser menor si es que la cantidad de caracteres que quedan en el archivo es menor de 100. 6.16 Captulo 6:Control de Excepciones y Archivos

Escritura: StreamWriter Esta clase funciona prcticamente de la misma manera que StreamReader, excepto que su propsito es nicamente para escribir dentro de un archivo (u otro stream). Es relevante distinguir que en este caso, el proceso de apertura para escritura considera que: - Si el archivo no existe lo crea vaco para comenzar a escribir. - Si el archivo ya existe, lo deja vaco para comenzar a escribir. - Si el archivo ya existe, es posible abrirlo en forma Append (agregar) para escribir al final. Constructores de StreamWriter El ms simple de los constructores toma slo el nombre/ruta del archivo a abrir para escritura. StreamWriter sw = new StreamWriter (@C:\Temp\archivo.txt); Este constructor asume por defecto el formato UTF8 de archivos planos, ya que es el manejado por .NET. Sin embargo, existe el constructor equivalente que permite abrir un archivo especificando otra codificacin de archivo plano, por ejemplo ASCII. StreamWriter sw = new StreamWriter (@C:\doc\file.txt, Encoding.ASCII); Un tercer constructor utiliza como segundo parmetro un boolean que indica si el archivo debe ser abierto para Agregar, es decir, en un modo Append. StreamWriter sw = new StreamWriter (@C:\Temp\archivo.txt, true); De la misma manera que en el caso de la lectura, para cerrar un stream o archivo, se invoca el mtodo close. sw.Close();

Escritura con StreamWriter Son bsicamente dos los mtodos propios de StreamWriter que permiten escribir hacia el stream (archivo) declarado y son los mismos que se usan para escribir en la consola: Write() y WriteLine(). WriteLine() 6.17 Captulo 6:Control de Excepciones y Archivos Write () Tambin presente, el mtodo simple Write(), permite escribir texto en el stream, de la misma forma que su equivalente mtodo de la clase Console. En este caso se reconocen las siguientes alternativas de uso: Imprimir un string string linea = Texto de prueba; sw.Write(linea);

Imprimir un carcter char caracter = T; sw.Write(caracter); Imprimir un arreglo de caracteres char[] caracteres = new char[100]; for(int i=0; i