P. 1
C_Sharp_y_objetos

C_Sharp_y_objetos

|Views: 23|Likes:
Publicado porinuyasha777

More info:

Published by: inuyasha777 on Aug 01, 2011
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

10/29/2011

pdf

text

original

Sections

  • Clases y Objetos
  • 2.1. Clases
  • 2.1.1. Estructura
  • 2.1.2. Ocultaci´on de la informaci´on
  • 2.1.3. Relaciones entre clases: Cliente-Servidor y Herencia
  • 2.1.4. Visibilidad
  • 2.2. Objetos
  • 2.3. Mensajes
  • 2.3.1. Sintaxis. Notaci´on punto
  • 2.3.2. Sem´antica
  • 2.4. Sem´antica referencia versus sem´antica almacenamiento
  • 2.5. Creaci´on de objetos
  • 2.5.1. Destructores
  • 2.6. Sem´antica de la asignaci´on e igualdad entre objetos
  • 2.7. Genericidad
  • 2.8. Definici´on de una clase “Lista Doblemente Enlazada”
  • 3.1. Contrato software
  • 3.2. Clases y Correcci´on del software: Asertos
  • 3.3. Excepciones en C#
  • 3.3.1. Lanzamiento de excepciones
  • 3.3.2. Bloques try
  • 3.3.3. Manejadores
  • 3.4. Conversi´on de asertos en excepciones
  • 4.1. Introducci´on
  • 4.2. Doble aspecto de la herencia
  • 4.3. Polimorfismo
  • 4.3.1. Sobrecarga
  • 4.3.2. Regla de aplicaci´on de propiedades
  • 4.3.3. Estructuras de datos polim´orficas
  • 4.3.4. Operadores is y as
  • 4.4. Ligadura Din´amica
  • 4.5. Clases Diferidas
  • 4.5.1. Interfaces
  • 4.6. Herencia, reutilizaci´on y extensibilidad del software
  • 4.7. Herencia m´ultiple

Programaci´n o Orientada a Objetos C#

F´lix G´mez M´rmol e o a
3o Ingenier´ Inform´tica ıa a Julio de 2004

2

´ Indice general
´ Indice General 2. Clases y Objetos 2.1. Clases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1. Estructura . . . . . . . . . . . . . . . . . . . . . . . 2.1.2. Ocultaci´n de la informaci´n . . . . . . . . . . . . . o o 2.1.3. Relaciones entre clases: Cliente-Servidor y Herencia 2.1.4. Visibilidad . . . . . . . . . . . . . . . . . . . . . . . 2.2. Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3. Mensajes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3.1. Sintaxis. Notaci´n punto . . . . . . . . . . . . . . . . o 2.3.2. Sem´ntica . . . . . . . . . . . . . . . . . . . . . . . . a 2.4. Sem´ntica referencia versus sem´ntica almacenamiento . . . a a 2.5. Creaci´n de objetos . . . . . . . . . . . . . . . . . . . . . . o 2.5.1. Destructores . . . . . . . . . . . . . . . . . . . . . . 2.6. Sem´ntica de la asignaci´n e igualdad entre objetos . . . . . a o 2.7. Genericidad . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.8. Definici´n de una clase “Lista Doblemente Enlazada” . . . o 3. Dise˜ o por Contrato: Asertos y Excepciones n 3.1. Contrato software . . . . . . . . . . . . . . . . 3.2. Clases y Correcci´n del software: Asertos . . o 3.3. Excepciones en C# . . . . . . . . . . . . . . . 3.3.1. Lanzamiento de excepciones . . . . . . 3.3.2. Bloques try . . . . . . . . . . . . . . . 3.3.3. Manejadores . . . . . . . . . . . . . . 3.4. Conversi´n de asertos en excepciones . . . . . o 4. Herencia 4.1. Introducci´n . . . . . . . . . . . . . . . . . o 4.2. Doble aspecto de la herencia . . . . . . . . 4.3. Polimorfismo . . . . . . . . . . . . . . . . 4.3.1. Sobrecarga . . . . . . . . . . . . . 4.3.2. Regla de aplicaci´n de propiedades o 4.3.3. Estructuras de datos polim´rficas . o 4.3.4. Operadores is y as . . . . . . . . 4.4. Ligadura Din´mica . . . . . . . . . . . . . a 4.5. Clases Diferidas . . . . . . . . . . . . . . . 4.5.1. Interfaces . . . . . . . . . . . . . . 4.6. Herencia, reutilizaci´n y extensibilidad del o 4.7. Herencia m´ltiple . . . . . . . . . . . . . . u 3 4 5 5 5 7 8 9 10 10 10 10 11 11 12 12 14 14 17 17 17 18 20 21 22 22 25 25 26 26 27 29 29 29 30 31 32 34 37

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . software . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

4

´ INDICE GENERAL

4.7.1. Problemas: Colisi´n de nombres y herencia repetida . . . . . . . . . . o 4.7.2. Ejemplos de utilidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.8. C#, Java y C++: Estudio comparativo . . . . . . . . . . . . . . . . . . . . . ´ Indice de Figuras ´ Indice de Tablas ´ Indice de C´digos o Bibliograf´ ıa

37 38 39 41 43 45 47

1 Una clase es una implementaci´n total o parcial de un tipo abstracto de o o dato (TAD). 2. WriteLine (" Kil´ metros = " o + lunaKilo + " km . que a partir de ahora llamaremos miembros. lunaKilo = ( int ) ( luna * 1. public class Luna { public static void Main () { int luna = 238857. que determinan una estructura de almacenamiento para cada objeto de la clase. Clases Definici´n 2.1.1: Clase Luna o 5 .Tema 2 Clases y Objetos 2. convierte a kil´metros la o o distancia de la Tierra a la Luna en millas. que no son m´s que operaciones aplicables sobre los objetos.1. int lunaKilo .1.") . y M´todos. } } C´digo 2.1 La clase mostrada en el c´digo 2. son: Atributos. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 // Distancia hasta la Luna convertida a kil´ metros o using System . e a Ejemplo 2.609) . llamada Luna. Sus caracter´ ısticas m´s destacables son que se trata de entidades sint´cticas y que descria a ben objetos que van a tener la misma estructura y el mismo comportamiento. Console . WriteLine (" De la Tierra a la Luna = " + luna + " millas ") .1. Estructura Los componentes principales de una clase. Console .

4294967295) (-9223372036854775808.6 Tema 2. 2.9 × 10+28 ) de 28 a 29 d´ (10 ıgitos significativos Tabla 2. 7. Para declarar un tipo consistente en un conjunto etiquetado de constantes enteras se emplea la palabra clave enum (por ejemplo. e Palabras reservadas La tabla 2. 65535) (-2147483648. 9223372036854775807) (0. enum Edades {F´lix = 21.1. Clases y Objetos Tipo short ushort int uint long ulong Bytes 2 2 4 4 8 8 Rango de Valores (-32768.4 muestra las palabras reservadas de C#. Alberto = 15}).4 × 1038 ) 7 d´ ıgitos significativos (±1.2: Tipos flotantes primitivos Tipo byte ubyte bool char Bytes 1 1 1 2 Rango de Valores (-128. abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach get goto if implicit in int interface internal is lock long namespace new null object operator out override params private protected public readonly ref return sbyte sealed set short sizeof stackalloc static string struct switch this throw true try typeof unit ulong unchecked unsafe ushort using value virtual void volatile while Tabla 2. 2147483647) (0.3: Otros tipos primitivos Tipos de datos primitivos Las tablas 2. 18446744073709551615) Tabla 2. Alex. 32767) (0.3 muestran los tipos primitivos soportados por C#.127) (0. false} Tabla ASCII Tabla 2.7 × 1038 ) de 15 a 16 d´ ıgitos significativos −28 .2 y 2.1: Tipos enteros primitivos Tipo float double decimal Bytes 4 8 16 Rango de Valores (±3.4: Palabras reservadas .255) {true.

Otra pr´ctica interesante consiste en declarar un atributo como privado y.9) . o Para llevar a cabo esto.5. w . y . un miembro protegido s´lo es accesible por miembros de la misma clase o ´ o bien por miembros de alguna de las subclases. } } . el servidor deber´ o ıa ocultar los aspectos de implementaci´n al cliente.3 En el siguiente c´digo. Por ultimo. } } C´digo 2. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class Punto { private double x .1 Clases 7 2. mientras que uno con acceso p´blico es accesible desde cualquier u clase. mediante o o o la clase Punto.4 En el c´digo 2. y = v. SetPunto (4. . . en C# es posible declarar un miembro como de s´lo lectura mediante o la palabra clave readonly. . n y m podr´ o ıamos decir que son “estructuralmente equivalentes”: public const n. C# proporciona tres tipos de acceso: p´blico. en una relaci´n entre clases de Cliente-Servidor. // Error sint´ ctico a . double v ) { x = u.3 se muestra un ejemplo de ocultaci´n de informaci´n mediante o o o el uso de get y set. Obs´rvese que el identificador value es siempre un objeto del mismo tipo que el atributo e que lo contiene. u Un miembro con acceso privado (opci´n por defecto) s´lo es accesible desde otros miemo o bros de esa misma clase. . x = 5. Ejemplo 2. public static readonly m. .6. Ocultaci´n de la informaci´n o o En ocasiones conviene ocultar ciertas caracter´ ısticas (atributos y/o m´todos) de una clase e al exterior. . o Una forma de simular el efecto de const mediante readonly es usando adem´s la palabra a clave static. . public void SetPunto ( double u . Ejemplo 2. Por ejemplo. // O simplemente double x .2 En el c´digo 2. mientras que con la segunda opci´n la inicializaci´n se da en o o o tiempo de compilaci´n. y .2. Para ello nos u valemos de los modificadores de acceso get y set. mediante otro a atributo p´blico tener acceso de lectura y/o escritura sobre el atributo privado.1.2.2: Ejemplo de Ocultaci´n de Informaci´n o o o A diferencia de C++. La diferencia entre readonly y const es que con la primera opci´n la inicializaci´n tiene o o lugar en tiempo de ejecuci´n.2 se muestra un ejemplo de ocultaci´n de informaci´n. class Test { public void Prueba ( Punto w ) { . Ejemplo 2. // Correcto w . privado y protegido.3 .

b: class A: B { . } .1. as´ como que pueda ser usada por el mayor n´mero de clientes ı u posible. variable local) e es de o a tipo B. el siguiente c´digo muestra la relaci´n de herencia mostrada en la figura o o 2.a: o o class A { . adaptable.2 Una clase A se dice que es cliente de una clase B.3 Una clase A se dice que hereda de otra clase B. B conta.a muestra la relaci´n de clientela entre A y B. conocer su especificaci´n. en cambio.1.b se o observa la relaci´n de herencia entre dichas clases. mientras que en la 2. o A⇐B (a) B ↑ A (b) Figura 2. } Por su parte. si A es una versi´n especiao o lizada de B (herencia de especializaci´n).3: Otro ejemplo de Ocultaci´n de Informaci´n o o o 2. . .3. . . o e El creador de la clase. Clases y Objetos 1 2 3 4 5 6 7 8 9 10 11 12 13 public class CuentaPalabras { private string m_file_output . } // Acceso de lectura set { // Acceso de escritura if ( value . debe preocuparse de que dicha clase sea lo m´s reutilia zable. es decir. Relaciones entre clases: Cliente-Servidor y Herencia Un cliente de una clase debe ver a ´sta como un TAD. . si A contiene una declao raci´n en la que se establezca que cierta entidad (atributo.1. // Atributo privado public string OutFile // Atributo p´ blico asociado u { get { return m_file_output . Length != 0 ) m_file_output = value . Definici´n 2. o bien si A es una implementaci´n de B (herencia o o de implementaci´n). .5 El siguiente c´digo muestra la relaci´n de clientela vista en la figura 2. } } } C´digo 2.1. Definici´n 2. e o pero sin importarle su implementaci´n (siempre que ´sta sea eficiente y potente). par´metro. y eficiente. o La figura 2. .1.1: Clientela y Herencia entre A y B Ejemplo 2.8 Tema 2.

1 Clases 9 Por ultimo cabe decir que la herencia es una decisi´n de dise˜o m´s comprometedora que ´ o n a la clientela. } private int c . u.2 acerca de la ocultaci´n de informaci´n. 2. } public Tres y . Visibilidad Adem´s de lo comentado en el apartado 2. } } C´digo 2. se puede modificar la implementaci´n de e o B sin que esto afecte a A). sin afectar a ´ste (en nuestro ejemplo. o El resultado mostrado por pantalla ser´ ıa: IntAnidado(6) = 17 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 public class Uno { public int c .6 El c´digo 2. x .c = c = e. c + c . } public class PruebaAnidada { public static void Main () { Dos x = new Dos () .1. return u . } public class Dos { public int c . en a o o esta secci´n trataremos la cuesti´n de las clases anidadas.4: Ejemplo de Clases Anidadas o .4 muestra un ejemplo de clases anidadas. y = new Tres () .2.4 Una clase anidada no es m´s que una clase que se declara dentro de otra y o a que tiene visibilidad sobre todas las propiedades de los objetos de la clase que la incluye. pues en ´sta ultima se puede cambiar la implementaci´n de la clase que se emplea e ´ o en el cliente. public class Tres { public int IntAnidado ( int e ) { Dos d = new Dos () . Console .c = 5 + e. d. Uno u = new Uno () .4. Ejemplo 2. o o Definici´n 2.1. WriteLine (" IntAnidado (6) = " + IntAnidado (6) ) .

5 Un objeto es una instancia de una clase.3). la forma en que se invoca a un m´todo es mediante el operador punto. el objeto receptor. efectuando el correspondiente paso de e par´metros. Este objeto recibe u o el nombre de instancia actual.2.2 y 2. mientras que se dice que son compuestos si sus valores son subobjetos o referencias. el paso de par´metros es “por valor”. a a o ..SetPunto(4. Socio.1. patrones de dise˜o y GUI. 2.3.6. Notaci´n punto o Como se ha podido observar en algunos de los ejemplos vistos hasta ahora.1. n o n El estado de un objeto viene dado por la lista de pares atributo/valor de cada campo. Dichos campos son simples si corresponden a atributos de tipos primitivos (v´ase tablas e 2. Objetos software: • Procedentes del an´lisis: objetos del dominio. Si no se incluye nada. cada objeto se identifica un´ ıvocamente mediante su identificador de objeto (oid). a Cuando un mensaje no especifica al objeto receptor la operaci´n se aplica sobre la instancia o actual. Mientras exista. Una posible clasificaci´n de los objetos podr´ ser: o ıa Objetos externos: Son aquellos que existen en el dominio de la aplicaci´n. ´ 2. creada en tiempo de ejecuci´n y o o formada por tantos campos como atributos tenga la clase. 2. siguiendo una sintaxis como la e que a continuaci´n se muestra: o receptor. . a saber.3. Por ejemplo. Sem´ntica a La diferencia entre un mensaje y la invocaci´n a un procedimiento es que en ´ste ultimo o e ´ todos los argumentos reciben el mismo trato. o En cada instante de la ejecuci´n de una aplicaci´n Orientada a Objetos (en adelante. mientras que en los mensajes uno de esos argumentos.3. OO) o o existe un objeto destacado sobre el que se realiza alg´n tipo de operaci´n. Objetos Definici´n 2.2. Para hacer referencia a la instancia actual en C# se emplea la palabra reservada this.10 Tema 2. recibe un “trato especial”. Comercial. Descuento.3. a • Procedentes del dise˜o/implementaci´n: TDA’s.m´todo(argumentos) e 2. Su modificaci´n y consulta se realiza mediante mensajes. o e Constan de tres partes: objeto receptor. Para especificar un paso de a par´metros “por referencia” se emplea la palabra clave ref delante del par´metro en cuesti´n. Clases y Objetos 2. Sintaxis. Ejemplo 2.9) lo que se est´ queriendo decir es que se a aplique el m´todo SetPunto sobre el objeto receptor w. identificador del m´todo y los argumentos de ´ste e e ultimo. Mensajes Los mensajes son el mecanismo b´sico de la computaci´n OO y consisten en la invocaci´n a o o de la aplicaci´n de un m´todo sobre un objeto. o Producto..7 En el mensaje w.

Creaci´n de objetos o En C# existe un mecanismo expl´ ıcito de creaci´n de objetos mediante la instrucci´n de o o creaci´n new y los llamados m´todos constructores (que deben tener el mismo nombre que la o e clase en la que se definen).4: Variables en los lenguajes OO Algunas ventajas de los tipos referencia son: Son m´s eficientes para manejar objetos. Dan soporte al polimorfismo.22 ). Los objetos son creados cuando son necesarios. aunque tambi´n existen los tipos primitivos (figura 2. Pero ojo. e Toda referencia puede estar. 1 2 TE→Tiempo de Ejecuci´n o TC→Tiempo de Compilaci´n o . Sin embargo tambi´n se pueden inicializar con unos valores por defecto. a Constituyen un soporte para definir estructuras de datos recursivas.5. o bien no ligada (con valor null). como ya hemos visto.2: Variables en los lenguajes tradicionales Figura 2. o si se le asigna una referencia ya ligada).4 Sem´ntica referencia versus sem´ntica almacenamiento a a 11 2. Sem´ntica referencia versus sem´ntica almacenamiento a a En C# se tiene sem´ntica referencia (figura 2.41 ) para cualquier entidad asociada a una a clase. Se permite la compartici´n de un objeto.2. Figura 2. o bien ligada a un objeto (mediante el operador new. mediante los constructores e por defecto (aquellos que no tienen argumentos). la asignaci´n o no implica copia de valores sino de referencias (⇒ Aliasing).3: Variables tipo “puntero” en los lenguajes tradicionales Figura 2. Estos constructores se encargan de inicializar los atributos con valores consistentes.4. o 2.

Clases y Objetos Ejemplo 2. los destructores ı carecen de ellos. Cuando un objeto es recogido por el recolector de basura3 se llama impl´ ıcitamente a su destructor.5).5 muestra un ejemplo de una clase con un constructor y un conso tructor por defecto. } 2.6: Ejemplo de copia profunda 3 garbage collector . } // Constructor por defecto Contador ( int i ) { conta = i % 100. Destructores Un destructor es un m´todo cuyo nombre es el nombre de la clase precedido de una tilde e ∼. pues ıa con el recolector de basura es suficiente para la finalizaci´n.5: Ejemplo de Constructores o Contador () { conta = 0. o 2. No obstante.7 Una copia se dice que es profunda si se crea un objeto con una estructura o id´ntica al objeto origen y sin compartici´n de referencias (figura 2. 1 2 3 4 5 6 7 8 9 10 11 12 public class Contador { private int conta .6 Una copia se dice que es superficial si se copian los valores de cada campo o del objeto origen en el objeto destino y ambos comparten referencias (figura 2. } void Click () { conta = ( conta + 1) % 100. } // Constructor int Conta { return conta . Mientras que los constructores s´ pueden tener modificadores de acceso.5: Ejemplo de copia superficial Definici´n 2.5.8 El c´digo 2. en la mayor´ de los casos las clases no necesitan destructores.6).1.12 Tema 2. } { conta = value % 100.6. e o Figura 2. Sem´ntica de la asignaci´n e igualdad entre objetos a o Definici´n 2. public public public { get set } public } C´digo 2. Figura 2.

++ i ) for ( int j = 0. j ] = m_mat [i .6 muestra un ejemplo de una clase que implementa el m´todo o e Clone() de la interfaz ICloneable para conseguir una copia profunda.8 Dos variables se dice que son id´nticas si ambas referencian al mismo objeto o e (figura 2. ++ j ) mat .Equals(ob) . e Ejemplo 2. int col ) { m_row = ( row <= 0 ) ? 1 : row .6: Ejemplo de implementaci´n del m´todo Clone() o o e Nota.5 y 2. En C# esto se expresa de la siguiente forma: oa == ob Figura 2. . return mat . m_col ]. } public object Clone () { matrix mat = new matrix ( m_row . m_mat [i . Definici´n 2. m_mat = new double [ m_row . public matrix ( int row .6 es equivalente al o siguiente c´digo: o if (row <= 0) m_row = 1. i < m_row . m_col = ( col <= 0 ) ? 1 : col .7: Ejemplo de variables id´nticas e Definici´n 2.9 El c´digo 2. la asignaci´n implica compartici´n de referencias si se o o tiene sem´ntica referencia.2.7).La l´ ınea 6 (equivalentemente la l´ ınea 7) del c´digo 2. En C# esto se expresa de la siguiente forma: oa. for ( int i = 0. j < m_col . 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 public class matrix : ICloneable { . j ]. mientras que si se tiene sem´ntica almacenamiento entonces se a a copian los valores.6 Sem´ntica de la asignaci´n e igualdad entre objetos a o 13 Como ya se dijo anteriormente. lo cual puede llevarse a cabo.. a Si se tiene sem´ntica referencia y se realiza una copia superficial. A este tipo de copia se le llama copia superficial y est´ soportada en C#.7). o Para evitar este efecto debemos realizar una copia profunda. los cambios hechos en a una variable tienen repercusi´n en su(s) correspondiente(s) copia(s). } } C´digo 2. else m_row = row. implementando el m´todo Clone() de la interfaz ICloneable. por ejemplo. m_col ) .9 Dos variables se dice que son iguales si ambas referencian a objetos con o valores iguales en sus campos (figuras 2. .

next = d . DListElement d ) { data = val . Previous = null . } public DListElement ( object val . } set { data = value . } public DList ( object val ) { head = new DListElement ( val ) . Next = head . tambi´n habr´ igual´ o e a dad superficial (figura 2. 2. } } private DListElement next . mediante el empleo de la clase ra´ ız Object. head . public class DListElement { public DListElement ( object val ) { data = val . Genericidad C++ hace uso de plantillas. previous = this . a saber.8. Imposibilidad de asegurar homogeneidad.7. } set { next = value . } } public DListElement Data { get { return data . 2. con los consabidos inconvenientes: Necesidad de conversiones expl´ ıcitas de tipo. } } public DListElement Previous { get { return previous . Dichas plantillas est´n propuestas para Java y C#. } public DListElement Next { get { return next . } .14 Tema 2. private object data . Clases y Objetos De esta ultima definici´n se deduce que siempre que haya identidad.5). pero e a a´n est´n en una fase experimental.7). } public class DList { public DList () { head = null . u a C# consigue “genericidad” al estilo de Java. pero no necesariamente a la inversa (figura 2. que son altamente eficientes y muy potentes. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 Definici´n de una clase “Lista Doblemente Enlazada” o using System . para implementar clases contenedoras gen´ricas. } set { previous = value . d . previous .

Previous .2. } else { DListElement h = new DListElement ( val . Exception (" Empty DList ") . } public void Add ( object val ) { if ( IsEmpty () ) { head = new DListElement ( val ) . } private DListElement Delete ( DListElement h ) { if ( h == null ) return null . h = h . Data ) ) break . Data . Next . } public DListElement Find ( object val ) { DListElement h = head . } return h . head = h . DListElement np = h . if ( pp != null ) pp . else head = null . Equals ( h . pp = h . while ( h != null ) { if ( val . Previous = pp . head ) .8 Definici´n de una clase “Lista Doblemente Enlazada” o 15 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 public bool IsEmpty () { return head == null . Previous = h . } . head . } } public object Front () { if ( IsEmpty () ) throw new System . head . if ( np != null ) np . Next = head . Next . Previous = null . Next . Next = np . return head . return h .

distinta a la esperada. respectivamente. ıa o En la l´ ınea 55 se ve un ejemplo del uso de excepciones. else return ( first . y en la l´ ınea 90 vemos c´mo se sobrescribe el m´todo heredado ToString()4 .16 Tema 2. respectivamente. En la l´ ınea 65 vemos un ejemplo de uso del m´todo Equals.7: Lista gen´rica doblemente enlazada o e A continuaci´n destacaremos algunos aspectos de este c´digo: o o Obs´rvese el uso de get y set en las l´ e ıneas 13 a 20 (en m´todos declarados como p´blicos) e u y las declaraciones privadas de las l´ ıneas 22 y 23. } static string To String Recursive ( DListElement first ) { if ( first == null ) return "". Clases y Objetos 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 public DListElement Delete ( object v ) { return Delete ( Find ( v ) ) . Es este un ejemplo de ocultaci´n de o informaci´n. Next ) . } private DListElement head . Data + "\ n ") + ToStr ingRec ursive ( first . las cuales trataremos en el siguiente tema. as´ es como se consigue “genericidad” en ı C#. as´ como la sobrecarga de constructores en las l´ ı ıneas 4 y 6. Como se observa en la l´ ınea 23 de este c´digo los datos almacenados en la lista son de o tipo object. El empleo del operador e == en esta l´ ınea provocar´ una ejecuci´n incorrecta. } C´digo 2. } public override string ToString () { return ToStr ingRec ursive ( head ) . Podemos ver la implementaci´n de un constructor por defecto y un constructor en las o l´ ıneas 28 y 29. o Otro ejemplo de ocultaci´n de informaci´n es la declaraci´n como privados de los m´too o o e dos Delete y ToStringRecursive de las l´ ıneas 72 y 93. o e 4 Todo lo relacionado con la herencia se ver´ en profundidad en el tema 4 a . Como ya se dijo anteriormente.

a Establecer una prueba formal completa de correcci´n del software es algo muy deseable. no se lleva a cabo en la mayor´ de las ocasiones. sin embargo permite al programador intentar recuperarse frente a estas situaciones y as´ continuar con la ejecuci´n del programa. De hecho. o pero por desgracia.2. o Ejemplo 3.1. A estas condiciones se le conocen como o precondiciones. debe garantizar que. la ejecuci´n proporciona una o o u o salida de diagn´stico. ı o 3. con el mensaje mensaje.1 En el c´digo 3. C#. Seg´n este modelo. por su parte. o Si la expresi´n expresi´n booleana se eval´a como falsa. si el cliente cumple con las precondiciones. la discipliıa na consistente en plantear asertos apropiados frecuentemente consigue que el programador advierta y evite bastantes errores de programaci´n que antes podr´ pasar desapercibidos. invocado de la siguiente manera: e Assert(expresi´n booleana. Los asertos se habilitan definiendo la variable o DEBUG. o 17 . siempre que la entrada sea correcta. as´ como del empleo o ı de listeners para visualizar los mensajes de diagn´stico por pantalla. Las excepciones son habitualmente condiciones inesperadas de error que provocan la finalizaci´n del programa en el que o tienen lugar. 3.Tema 3 Dise˜ o por Contrato: Asertos y n Excepciones En este tema se describe el manejo de excepciones en C#.mensaje). Clases y Correcci´n del software: Asertos o La correcci´n de los programas se puede ver en parte como una prueba de que la ejecuci´n o o terminar´ proporcionando una salida correcta. el usuario (cliente) debe garantizar que se cumplen las condiciones u necesarias para una correcta aplicaci´n del software.1 se muestra un ejemplo del uso de asertos. o ıan En C# la clase Debug contiene el m´todo Assert(). El proveedor (servidor). con un mensaje de error. Para acceder a dicha salida de diagn´stico se emplean los listener. que se cumplen las postcondiciones. el software realizar´ la tarea deseada satisfactoriamente. Si esto es as´ se dice a ı. Contrato software Desde un punto de vista una excepci´n se puede decir que se basa en el incumplimiento o del contrato software entre el cliente y el servidor de una clase.

Listeners . string datos . using System . public class AssertSqrRoot { public static void Main () { Debug . u datos = Console . Console . Excepciones en C# C# contiene la clase est´ndar System. . Listeners . Un c´digo de C# puede alcanzar una excepci´n en un bloque try mediante la expresi´n o o o throw. WriteLine (" La ra´ z cuadrada es " + Math . Debug . o la expresi´n throw y los manejadores definidos mediante la palabra clave catch. Dise˜ o por Contrato: Asertos y Excepciones n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # define DEBUG using System . WriteLine ( x ) . en el cual se declaran los manejadores (handlers) al final del a mismo mediante la palabra clave catch. Y dicho contexto no es m´s que un bloque try. que es el objeto o la clase base de un a objeto lanzado por el sistema o por el usuario cuando ocurre un error en tiempo de ejecuci´n. Assert ( x > 0 . La excepci´n es entonces tratada por alguno de los manejadores que se encuentran al o final del bloque try. ı } } C´digo 3. con un bloque try. double x . Sqrt ( x ) ) . readLine () .1: Ejemplo del uso de asertos o El uso de asertos reemplaza el uso ad hoc de comprobaciones condicionales con una metodolog´ m´s uniforme. o El mecanismo de manejo de excepciones en C# es sensible al contexto.2 muestra un ejemplo del uso de excepciones. El inconveniente de los asertos es que no permiten una estrategia ıa a de reparaci´n o reintento para continuar con la ejecuci´n “normal” del programa.Exception. Clear () . Console . WriteLine (" Introduzca un n´ mero real positivo :") . " Valor no positivo ") .18 Tema 3. x = double . Parse ( datos ) . Out ) ) . Diagnostics .3. string datos . Debug . public class LanzaExcepcion { public static void Main () { try { double x . o 1 2 3 4 5 6 7 8 using System . Add ( new T e x t W r i t e rT r ac eL i st e ne r ( Console . Console .2 El c´digo 3. Ejemplo 3. o o 3.

3.IO para las excepciones de E/S Intento de referenciar a null Ejecuci´n fuera de la memoria heap o (mont´n) o Tabla 3. x = double . WriteLine (" Introduzca un double :") . a o SystemException ApplicationException ArgumentException ArgumentNullException ArgumentOutOfRangeException ArithmeticException DivideByZeroException IndexOutOfRangeException InvalidCastException IOException NullReferenceException OutOfMemoryException Clase base para las excepciones del sistema Clase base para que los usuarios proporcionen errores de aplicaci´n o Uno o m´s argumentos son inv´lidos a a Pasado null no permitido Fuera de los valores permitidos Valor infinito o no representable Auto-explicativa ´ Indice fuera de los l´ ımites del array Cast no permitido Clase base en el espacio de nombres System. else Console . datos = Console . Exception () ) . if ( x > 0) throw ( new System . WriteLine (" La ra´ z cuadrada es " ı + Math .2: Propiedades de las excepciones . readLine () .3 Excepciones en C# 19 9 10 11 12 13 14 15 16 17 18 19 20 21 Console . Parse ( datos ) . mientras que en la tabla 3. } o } } C´digo 3.1: Algunas Excepciones est´ndar a HelpLink InnerException Message StackTrace Source TargetSize Obtiene o establece un enlace a un fichero de ayuda Obtiene la instancia de Exception que caus´ la excepci´n o o Texto que describe el significado de la excepci´n o Traza de la pila cuando se llam´ a o la excepci´n o Aplicaci´n u objeto que gener´ la o o excepci´n o M´todo que lanz´ la excepci´n e o o Tabla 3. WriteLine (" Lanzada excepci´ n " + e ) .2: Ejemplo del uso de excepciones o La tabla 3. WriteLine ( x ) . Console . Sqrt ( x ) ) . } catch ( Exception e ) { Console .1 muestra algunas excepciones est´ndar en C#.2 a podemos observar las propiedades est´ndar que toda excepci´n debe tener.

el lanzamiento de una excepci´n pasa cierta informaci´n a los manejao o dores.3 El c´digo 3. } catch ( Exception e ) { Console . o 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 using System . WriteLine (" Primera captura " + e ) . . El bloque try m´s interno en el que se lanza una excepci´n es empleado a o para seleccionar la sentencia catch que procesar´ dicha excepci´n. . Lanzamiento de excepciones Mediante la expresi´n throw se lanzan excepciones. . . Sin embargo. . } o } } C´digo 3. Console . . Esta situaci´n puede ser util si deseamos que un segundo o ´ manejador llamado desde el primero realice un procesamiento m´s exhaustivo de la excepci´n a o en cuesti´n. a o Si lo que queremos es relanzar la excepci´n actual podemos emplear un throw sin arguo mentos en el cuerpo de un catch. las cuales deben ser objetos de la o clase Exception. throw . Dise˜ o por Contrato: Asertos y Excepciones n 3. En este caso ser´ o ıa apropiado “empaquetar” la informaci´n en un objeto derivado de una clase Exception ya o existente. Por ejemplo. throw new Exception (" Lanzada en LanzaMsg ") . . public class ReLanzaExcepcion { public static void LanzaMsg () { try { . . LanzaMsg () . // Relanzamiento } } public static void Main () { try { . un manejador e o que simplemente imprime un mensaje y aborta la ejecuci´n no necesita m´s informaci´n de o a o su entorno. el usuario probablemente querr´ informaci´n adicional por pantalla para a o seleccionar o ayudarle a decidir la acci´n a realizar por el manejador. . .20 Tema 3.1. .3. pero con frecuencia ´stos no precisa de dicha informaci´n.3: Ejemplo del relanzamiento de excepciones o Conceptualmente.3 muestra un ejemplo del relanzamiento de excepciones. } catch ( Exception e ) { . o Ejemplo 3. WriteLine (" Excepci´ n recapturada " + e ) . . .

stk . } catch ( StackError se ) { Console . El orden en el que se definen los manejadores determina el orden en el que se intenta invocar cada manejador que puede tratar la excepci´n que haya saltado.3. try { throw new StackError ( stk . } get { return msg . } public class StackError : Exception { public StackError ( Stack s . msg = message . public class Stack { public char [] s = new char [100]. s [99] = ’z ’. Si la excepci´n lanzada ha sido derivada de la clase base del manejador. WriteLine ( se .3 Excepciones en C# 21 Ejemplo 3.3. 2." Out of bounds ") . o El resultado mostrado por pantalla ser´ algo como: ıa Out of bounds with last char z 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 using System . } } } C´digo 3. }} private Stack st . } public char TopEntry () { return st . como muestra el siguiente ejemplo.4 El c´digo 3. string message ) { st = s .4: Uso de excepciones con m´s informaci´n o a o 3.4 muestra un ejemplo del uso de objetos para empaquetar inforo maci´n que se pasa a los manejadores de excepciones. Msg + " with last char " + se . s [99]. o Una excepci´n puede ser tratada por una manejador en concreto si se cumplen alguna de o estas condiciones: 1. } public string Msg { set { msg = value . . } public class StackErrorTest { public static void Main () { Stack stk = new Stack . private string msg . o Es un error listar los manejadores en un orden en el que se impida la ejecuci´n de alguno o de ellos.2. Bloques try Un bloque try es el contexto para decidir qu´ manejador invocar para cada excepci´n e o que se dispara. TopEntry () ) . Si hay una coincidencia exacta.

6 El c´digo 3. } } } class ExceptionSqrRoot { public static void ConsoleSqrt () { double x . Exception e ) { if (! cond ) { Console .5 Seg´n el siguiente c´digo: u o catch(ErrorClaseBase e) catch(ErrorClaseDerivada e) nunca se ejecutar´ el cuerpo del segundo catch. En este ejemplo se ve c´mo el programa hace uso del mecanismo de excepciones para o llamarse a s´ mismo recursivamente hasta que el usuario introduzca un n´mero v´lido para ı u a la entrada. Incluso existe un catch sin ning´n argumento. el cual maneja las excepciones no u tratadas por los manejadores que s´ tienen argumento. pues antes se encontrar´ una coincidencia ıa ıa con el primer catch. .22 Tema 3. WriteLine ( message ) . Error . throw e . o Ejemplo 3. nos salimos del bloque e o try y autom´ticamente se llama a los m´todos (incluidos los destructores) que liberan la a e memoria ocupada por todos los objetos locales al bloque try. WriteLine (" Introduzca un double positivo :") .1 del uso de asertos. se puede decidir (en algunos casos) entre a a o continuar la ejecuci´n del programa o abortarla de inmediato. ı Cuando se invoca a un manejador a trav´s de una expresi´n throw.4. mientras que con las excepciones. string message . La palabra clave finally despu´s de un bloque try introduce otro bloque que se ejecuta e despu´s del bloque try independientemente de si se ha lanzado una excepci´n o no. como ya hemos visto anteriormente. e o 3.3.1 que se muestra en el ejemplo o o 3. public class ExAssert { public static void MyAssert ( bool cond . u 3. Conversi´n de asertos en excepciones o La l´gica de las excepciones es m´s din´mica ya que los manejadores pueden recibir m´s o a a a informaci´n que los asertos. Manejadores La sentencia catch parece la declaraci´n de un m´todo con un solo argumento y sin valor o e de retorno.5 es una reescritura del c´digo 3. pero ahora mediante excepciones.3. o Los asertos simplemente imprimen un mensaje por pantalla. Dise˜ o por Contrato: Asertos y Excepciones n Ejemplo 3. adem´s de imprimir m´s informaci´n. seg´n lo dicho en las condiciones anteriores. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 using System . Console . string datos .

3. readLine () . ExceptionSqrRoot . x = double . Sqrt ( x ı )). new Exception () ) . MyAssert ( x > 0 . WriteLine (" La ra´ z cuadrada es " + Math . Parse ( datos ) .5: Ejemplo del uso de excepciones en vez de asertos o . WriteLine ( e ) . ToString () . ConsoleSqrt () . WriteLine (" Probando Ra´ ces Cuadradas ") . } } C´digo 3. WriteLine ( x ) . ı ConsoleSqrt () . Console . Console . try { ExAssert . } catch ( Exception e ) { Console . " Valor no positivo : x = " + x . // Se vuelve a intentar } } public static void Main () { Console .4 Conversi´n de asertos en excepciones o 23 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 datos = Console .

24 Tema 3. Dise˜ o por Contrato: Asertos y Excepciones n .

pero puede incluir adaptaciones: e B puede a˜adir nuevos atributos. n B puede a˜adir nuevos m´todos. as´ como los privilegios de acceso. ıa o En muchas ocasiones distintas clases resultan ser variantes unas de otras y es bastante tedioso tener que escribir el mismo c´digo para cada una.1. Una clase derivada hereda la deso cripci´n de la clase base.1 se muestra un ejemplo de una jerarqu´ de clases.1 Si B hereda de A entonces B incorpora la estructura (atributos) y comporo tamiento (m´todos) de A. e ı Ejemplo 4. n e B puede redefinir m´todos de A (bien para extender el m´todo original. bien para e e mejorar la implementaci´n). consistente o o en derivar una nueva clase a partir de una ya existente. e 25 . Introducci´n o La herencia es un potente mecanismo para conseguir reutilizaci´n en el c´digo. o B puede implementar un m´todo diferido en A.Tema 4 Herencia 4.1 En la figura 4. A trav´s de la herencia es posible e crear una jerarqu´ de clases relacionadas que compartan c´digo y/o interfaces.1: Jerarqu´ de clases ıa Definici´n 4. ıa Figura 4. la cual se puede alterar a˜adiendo nuevos miembros y/o modificando o n los m´todos existentes.

c y 4. ıa bool Equals(object o) void Finalize() int GetHashCode() Type GetType() object MemberwiseClone() bool ReferenceEquals (object a. la herencia es. o Figura 4. o C# soporta el polimorfismo.d muestran la herencia como mecanismo de implementaci´n. si no. Sin o embargo. devuelve false Equivalente a escribir un destructor Proporciona un entero unico para ´ cada objeto Permite averiguar din´micamente el a tipo de objeto Permite clonar un objeto Devuelve true si los objetos son la misma instancia Devuelve un string que representa al objeto actual Tabla 4. por ser B una especializaci´n de A. o Por otra parte. o Podr´ ıamos categorizar el polimorfismo en dos tipos: Param´trico e Real y Aparente → Sobrecarga Inclusi´n (basado en la herencia) o . m´s refinada) de A. a la vez.2.26 Tema 4.a y 4.b sirve como mecanismo de especializaci´n.2. object b) string ToString() Devuelve true si dos objetos son equivalentes.2 La herencia entre clases que se observa en la figura 4. Polimorfismo Definici´n 4.2: Herencia de especializaci´n y de implementaci´n o o 4. o a Ejemplo 4.1.1: Propiedades de las excepciones 4.2.2 Podr´ o ıamos definir el polimorfismo como la capacidad que tiene una entidad para referenciar en tiempo de ejecuci´n a instancias de diferentes clases. Doble aspecto de la herencia Como ya se dijo en la definici´n 2. as´ como en las figuras ı 4. Herencia La tabla 4. ra´ en toda e u ız jerarqu´ de clases de C#. los ejemplos de las figuras 4.2.3.3. un mecanismo de especialio zaci´n y un mecanismo de implementaci´n. una clase B puede heredar de otra clase A.2. puede ocurrir que el motivo por el cual B hereda de A sea la necesidad de construir una implementaci´n “distinta” (si se quiere. lo cual quiere decir que sus entidades (las cuales poseen un unico tipo est´tico y un conjunto de tipos din´micos) pueden estar conectadas a una instancia ´ a a de la clase asociada en su declaraci´n o de cualquiera de sus subclases.1 muestra los m´todos p´blicos y protegidos de la clase object. o o Esto es.

a a Y por lo tanto las siguientes asignaciones ser´ v´lidas: ıan a p = t. si a y b son de tipo o o string. por ejemplo: 4. lo realmente interesante es poder redefinir operadores cuyos operandos sean de tipos definidos por el usuario.3 hace lo propio con los operadores binarios. c = p. Cuadrado} te(t) = Triangulo ctd(t) = {Triangulo} te(r) = Rectangulo ctd(r) = {Rectangulo. tambi´n es sobrecargado impl´ e ıcitamente. Pero conviene tener en cuenta que este tipo de actuaci´n s´lo es provechosa en aquellos o o casos en los que existe una notaci´n ampliamente usada que conforme con nuestra sobrecarga o (m´s a´n. Ejemplo 4. Triangulo t. hasta una suma entera. en el caso de los operadores relacionales <. Triangulo.3. si cabe.3: Operadores binarios “sobrecargables” Cuando se sobrecarga un operador tal como ‘+’. Uno de los ejemplos m´s claros es e a el del operador ‘+’. en punto flotante o de n´meros complejos. e a .2 muestra los operadores unarios que en C# se pueden sobrecargar. r = p. su operador de asignaci´n asociado. Cuadrado c.1. Pero no lo ser´ ıan. p = r. siguiendo la jerarqu´ de clases de la figura 4. o ıa Poligono p.3 Polimorfismo 27 Ejemplo 4. Tanto los operadores binarios como los unarios s´lo pueden ser sobrecargados mediante o m´todos est´ticos. N´tese que el operador de asignaci´n no puede o o sobrecargarse y que los operadores sobrecargados mantienen la precedencia y asociatividad de los operandos. a u La tabla 4. Sin embargo.4. C# soporta la sobrecarga de m´todos y de operadores.1. podemos decir que: te(p) = Poligono ctd(p) = {Poligono. p = c. r = c.3 La sobrecarga consiste en dar distintos significados a un mismo m´todo u o e operador. y C# permite hacer esto. todo ello depenu diendo del tipo de datos de a y b. >. Sobrecarga Definici´n 4. c = t. <= y >=). Cuadrado} te(c) = Cuadrado ctd(c) = {Cuadrado} donde “te” significa “tipo est´tico” y “ctd” significa “conjunto de tipos din´micos”.2: Operadores unarios “sobrecargables” + − ∗ / % & | ∧ << >> == ! = < > >= <= Tabla 4. Rectangulo. mientras que la tabla 4. o ‘+=’.4 La expresi´n a + b puede significar desde concatenaci´n. Rectangulo r. + − ! ∼ ++ −− true f alse Tabla 4. t = r.3 Dada la siguiente declaraci´n.

MyClock c2 ) { return new MyClock ( c1 .5 El c´digo 4. totSecs + c2 . } public override string ToString () { Reset ( totSecs ) . hours = 0 . } public void Tick () { Reset (++ totSecs ) . days = i / 86400. days . Esta pr´ctica com´n a a u evita que el operador sobrecargado tenga un orden prefijado en sus operandos. Format (" day {0: D2 } time :{1: D2 }:{2: D2 }:{3: D2 }" . Obs´rvese como en la l´ e ınea 32 se vuelve a definir el operador ‘*’. class MyClock { public MyClock () { } public MyClock ( unit i ) { Reset ( i ) . previamente sobrecargado por el m´todo de la l´ e ınea 29. } private uint totSecs = 0 . } public static MyClock operator +( MyClock c1 . mins = ( i / 60) % 60. hours . MyClock c ) { return new MyClock ( m * c . Tick () . o como binarios. mins .28 Tema 4. return String . } . days = 0. secs = 0 . } public static MyClock operator ++( MyClock c ) { c . Herencia Ejemplo 4. El resultado mostrado por pantalla tras ejecutarse el m´todo Main() ser´ e ıa: Initial times day 00 time:00:00:59 day 01 time:23:59:59 One second later day 00 time:00:01:00 day 02 time 00:00:00 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 using System . totSecs ) . } public void Reset ( unit i ) { totSecs = i .1 muestra un ejemplo de sobrecarga de operadores. tanto unarios. } public static MyClock operator *( MyClock c . secs ) . } public static MyClock operator *( uint m . hours = ( i / 3600) % 24. mins = 0 . totSecs ) . pero con los par´metros en orden inverso. secs = i % 60. uint m ) { return ( m * c ) . return c .

b = new MyClock (172799) . Definici´n 4. 2.. o o El operador as.. ser´ legal o o a si el tipo de y es compatible con el tipo de x. con id´ntica sintaxis devuelve la expresi´n expresi´n convertida al tipo e o o tipo. } } C´digo 4. o a 1 2 En adelante.3. devuelve true si se puede hacer un o “cast” de la expresi´n expresi´n al tipo tipo.4 Un tipo T1 es compatible con otro tipo T2.3 Polimorfismo 29 37 38 39 40 41 42 43 44 45 class MyClockTest { public static void Main () { MyClock a = new MyClock (59) . Los argumentos son compatibles con los par´metros y coinciden en n´mero.y. Estructuras de datos polim´rficas o La lista doblemente enlazada implementada en el c´digo 2.) a una rutina r(. Figura 4.r(y).. Console .4.. supuesta la declaraci´n X x. cuya sintaxis es expresi´n is tipo.1. devuelve null.3.T x..4. ++ b ... a u 3.7 es un claro ejemplo de eso tructura de datos polimorfa. Y r est´ disponible para la clase que incluye el mensaje. Console . ++ a . a 4. Regla de aplicaci´n de propiedades o Definici´n 4.6 Regla de Validez de un Mensaje 2 o Un mensaje ox. Si en la l´ ınea 23 de dicho c´digo en vez de poner private object data escribi´ramos o e private Figura data. X incluye una propiedad con nombre final r.1: Ejemplo de Sobrecarga de Operadores o 4.2.3: Ejemplo de estructura de datos polimorfa 4.. WriteLine (" One second later \ n " + a + ’\n ’ + b ) . Operadores is y as El operador is. Definici´n 4. RA En adelante. en un ıa instante dado podr´ ıamos tener una lista como la que se observa en la figura 4. ser´ legal si: o a 1. WriteLine (" Initial times \ n " + a + ’\n ’ + b ) . RVM .3.3. siguiendo el ejemplo de jerarqu´ de clases de la figura 4.3. si la clase de T1 es la misma o que la de T2 o una subclase de T2.5 Regla de la Asignaci´n 1 o o Una asignaci´n x = y o una invocaci´n r(. si la conversi´n no est´ permitida. o bien.).

7 El c´digo 4. a saber. siendo necesario incluir la a palabra clave virtual en aquellos m´todos que vayan a ser redefinidos y a los cuales s´ se e ı aplicar´ ligadura din´mica. oa. as´ como de la palabra clave ı override en la l´ ınea 9.f → δ En C#.1. por contra. como en C++. oa. Las letras griegas representan la versi´n de cada e o m´todo. En esto consiste la ligadura din´mica. oa. Los m´todos o e e e sobrecargados son seleccionados en tiempo de compilaci´n bas´ndonos en sus prototipos o a (argumentos y valor de retorno) y pueden tener distintos valores de retorno. Un m´todo redefinido. a a Aquellas subclases que quieran redefinir un m´todo declarado como virtual en la clase e base deber´n emplear para ello la palabra clave override. Obs´rvese tambi´n como el valor devuelto por el m´todo redefinido e e e de la l´ ınea 9 es el mismo que el del m´todo original de la l´ e ınea 4.f → α oa = od.2 muestra un ejemplo de redefinici´n de un m´todo heredado de la o o e clase base. din´mico del objeto oa: a oa = ob. C oc = new C(). Obs´rvese el uso de la palabra clave virtual en la l´ e ınea 4. a Ejemplo 4.30 Tema 4.4: Herencia y redefinici´n de m´todos o e Dadas las siguientes declaraciones: A oa.f → β oa = oc.4. como ya hemos visto en varios a ejemplos con el m´todo ToString(). Ligadura Din´mica a Como ya dijimos en la definici´n 4. El resultado mostrado por pantalla tras ejecutarse el m´todo Main() ser´ e ıa: Dentro de la clase base Dentro de la clase derivada Dentro de la clase derivada . B puede o redefinir m´todos de A e implementar m´todos que en A sean diferidos. es seleccionado en tiempo de ejecuci´n bas´ndonos en e o a el tipo din´mico del objeto receptor y no puede tener distinto valor de retorno del que tenga a el m´todo al que redefine. la ligadura es est´tica por defecto. D od = new D(). Herencia 4. la versi´n del m´todo que se ejecute depender´ del tipo din´mico del o e a a objeto de la clase A.4 se muestra una jerarqu´ de clases en las que algunas de ellas ıa redefinen el m´todo f de sus ancestras. A continuaci´n se muestra qu´ versi´n del m´todo f se ejecutar´ dependiendo del tipo o e o e ıa.6 En la figura 4. B ob = new B(). void. si una clase B hereda de otra clase A. e N´tese la diferencia entre un m´todo redefinido y un m´todo sobrecargado. e Figura 4. e Ejemplo 4. e e Entonces cuando tengamos un objeto de la clase A y una invocaci´n a un m´todo redeo e finido en la clase B.

cuyo m´todo o e abstracto Area() es implementado en las subclases Rectangulo y Circulo. } } class ClaseDerivada : ClaseBase { public override void Status () { Console . Status () . WriteLine (" Dentro de la clase derivada ") . o Sin embargo el m´todo abstracto Perimetro() es implementado en las tres subclases.8 El c´digo 4.2: Redifinici´n de un m´todo heredado o o e 4. b = d. e entonces sigue siendo abstracta. Ejemplo 4. ClaseDerivada d = new ClaseDerivada () . } } C´digo 4. y e para implementarlo en alguna subclase utilizamos la palabra clave override. Clases Diferidas Definici´n 4. abstract public double Perimetro () . WriteLine (" Dentro de la clase base ") . Para declarar en C# un m´todo como abstracto se emplea la palabra clave abstract. m´todos que deben ser implementados en las subclases. d . No se pueden crear instancias e de una clase abstracta.4. Es por ello que la subclase Triangulo sigue siendo abstracta.3 muestra un ejemplo de una clase abstracta Figura.7 Una clase diferida o abstracta es aquella que contiene m´todos abstractos. o e esto es. class ClaseBase { public virtual void Status () { Console . Status () .5. } .8). Si una clase hereda de otra clase abstracta y no implementa todos sus m´todos abstractos.5 Clases Diferidas 31 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 using System . Para ser m´s preciso. es a parcialmente abstracta (ver definici´n 4. } } class L i g a d u r a D i n a m i c a T e s t { public static void Main () { ClaseBase b = new ClaseBase () . e 1 2 3 4 5 6 using System . pero no en la subclase Triangulo. Status () . abstract class Figura { abstract public double Area () . b . b .

9 Una clase que unicamente contiene m´todos abstractos recibe el nombre de o ´ e interface. no puede contener miembros de datos. pues una clase abstracta puede estar parcialmente implementada.32 Tema 4. } public override double Perimetro () { return (( base * 2) + ( altura * 2) ) . } private double lado1 . lado3 = l3 . PI * radio * 2) . mientras que en C# a o ´ est´ permitida la herencia m´ltiple de interfaces3 . } public override double Area () { return ( Math . o Una interface puede heredar de otra interface. } private double radio . } public override double Area () { return ( base * altura ) . 4. Adem´s una clase s´lo puede heredar de una unica clase abstracta. lado3 . } class Circulo : Figura { public Circulo ( double r ) { radio = r . double l3 ) { lado1 = l1 .3: Clase abstracta Figura o Definici´n 4. PI * radio * radio ) . } public override double Perimetro () { return ( Math . Pero no confundamos.1. Por lo tanto las palabras clave abstract y public se pueden omitir. Herencia 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 class Rectangulo : Figura { public Rectangulo ( double a . } abstract class Triangulo : Figura { public Triangulo ( double l1 . } private double altura . lado2 . adem´s de ser abstractos como ya hemos dicho. o e 3 Lo veremos en profundidad m´s adelante a . s´lo m´todos. lado2 = l2 . Para referenciar al constructor de la clase base a˜adimos al final del constructor de la n clase derivada lo siguiente: : base(argumentos). } public override double Perimetro () { return ( lado1 + lado2 + lado3 ) . double l2 . } C´digo 4. u Para declarar una interface se emplea la palabra clave interface. sin embargo. double b ) { altura = a . deben e a ser p´blicos. El constructor de la clase base es invocado antes de ejecutar el constructor de la clase derivada.5. y para implementar una interface se emplea la notaci´n vista hasta ahora para la herencia. Interfaces Definici´n 4.8 Una clase parcialmente abstracta es aquella que contiene m´todos abstractos o e y efectivos. base = b . no es lo mismo que una clase abstracta. base . a u Todos los m´todos de una interface.

} string Nss { get . } int A~ oMatricula { get . } n } interface IProfesor : IPersona { double Salario { get . } } public string Telefono { get { return telefono .5 muestra el esquema de herencia e implementaci´n de las interfaces y la clase o en cuesti´n. n n } } . } } public bool esMayorDeEdad () { return ( edad >= 18) . } set { name = value . de la cual o heredan otras dos interfaces IEstudiante e IProfesor.5 Clases Diferidas 33 Ejemplo 4. que no la llevan. IEstudiante . Obs´rvese el convenio de nombrar a las interfaces con una ‘I’ may´scula delante del e u nombre. } set { notaMedia = value . } set { a~ oMatricula = value . } } public int A~ oMatricula n { get { return a~ oMatricula . } } public int Edad { get { return edad . } // N o seguridad social } class Ayudante : IPersona . Las tres son implementadas por la clase Ayudante. } bool esMayorDeEdad () . } interface IEstudiante : IPersona { double NotaMedia { get . set . o Figura 4. } set { edad = value .4 se muestra un ejemplo de una interface IPersona. set . set .9 En el c´digo 4. set . } set { telefono = value .5: Herencia e implementaci´n de interfaces o 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 interface IPersona { string Nombre { get . IProfesor { // M´ todos y propiedades requeridos por IPersona e public string Name { get { return name . set . set . set . } string Telefono { get .4. a diferencia de las clases. } int Edad { get . } // M´ todos y propiedades requeridos por IEstudiante e public double NotaMedia { get { return notaMedia . La figura 4.

. int a~ oMatricula . Conseguida gracias a la genericidad. nss . Format (" Nombre : {0: -20} Tel´ fono : {1 . 4. double nm . } } // Constructores para Ayudante public Ayudante ( string nom .6. double notaMedia . a~ oMatricula = am . notaMedia = nm . } set { nss = value . int edad . string telefono . string numSec ) { nombre = nom . string nss . Herencia 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 // M´ todos y propiedades requeridos por IProfesor e public double Salario { get { return salario . nss = numSec . int am . public override ToString () { return String . Conseguida gracias a la ligadura din´mio a ca y el polimorfismo.2}" + e "\ nSeguridad Social : {3} Salario : {4: C }" + "\ nNota media : {5} A~ o de matriculaci´ n : {6}" . telefono = tlf . Variaci´n en estructuras de datos y algoritmos. n salario = sal . } } public string Nss { get { return nss . a~ oMatricula ) . salario . o 2. double sal . Conseguida gracias a la ligadura din´mica y el o a polimorfismo. } set { salario = value . 3. telefono .34 Tema 4. edad = ed . n o nombre . string tlf .. edad . reutilizaci´n y extensibilidad del software o A continuaci´n enumeramos cu´les son los requerimientos que debe cumplir un m´dulo o a o para facilitar la reutilizaci´n: o 1. .9} Edad : {2 . int ed . Independencia de la representaci´n.4: Herencia M´ltiple mediante interfaces o u string nombre . n double salario . n } private private private private private private private } C´digo 4. Herencia. notaMedia . Variaci´n en tipos. } // Otras implementaciones de constructores y m´ todos e .

. de modo que se podr´ emplear la instrucci´n foreach con objetos de dicha a o clase (como puede observarse en la l´ ınea ). Conseguida gracias a la herencia. la creaci´n o o o de componentes reutilizables. using System . Collections . devolver el siguiente valor en la colecci´n y comprobar en cada instante si ya hemos iterado sobre todos o los elementos de la colecci´n. todos e ı e ellos de la interface IEnumerator.. Agrupaci´n de rutinas relacionadas. Captura de similitudes entre un un subgrupo de un conjunto de posibles implementaciones.4.5 muestra un ejemplo de una clase que implementa la interface o IEnumerable. la utilizaci´n de dichos componentes.Collections y la interface Collections. la segunda la 1.. class ArrayImpar : IEnumerable { public int [] a = new int [10]. La implementaci´n de la interface IEnumerate por parte de una clase contenedora dota o a ´sta de la posibilidad de emplear la instrucci´n foreach. o Para ello la interface IEnumerable declara el m´todo IEnumerator GetEnumerator(). o o Existen dos aspectos importantes en la reutilizaci´n de c´digo: por una parte. 3 7 11 15 19 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 using System . e No obstante. } public int this [ int i ] { get { return a [ i ].10 El c´digo 4. para realizar una implementaci´n concreta deben implementarse (valga la reo dundancia) los m´todos MoveNext() y Reset(). Conseguida mediante la construcci´n de clases. } set { a [ i ] = value . Se trata de un array de 10 enteros cuyo iterador s´lo indexa los elementos que ocupan o posiciones impares (teniendo en cuenta que la primera posici´n es la 0. Para construir un iterador necesitamos alguna manera de avanzar el iterador. reutilizaci´n y extensibilidad del software o 35 4.IEnumerable. o En C# existe una gran colecci´n (a´n en crecimiento) de elementos reutilizables. Ejemplo 4. cuya sintaxis es: e o foreach (Tipo nombreVariable in nombreArray) Mediante la instrucci´n foreach tenemos en cada iteraci´n en la variable nombreVariable o o el contenido de la clase contenedora. as´ como el m´todo de acceso Current. Noo u sotros trataremos ahora brevemente el contenido de System.6 Herencia. y por otra parte. 5. } } private class A r r a y I m p a r E n umerator : IEnumerator { public A r r a y I m p a r E n u m e r ator ( ArrayImpar a ) . s´lo e o puede consultarse. Obs´rvese que este valor no puede ser modificado.). public IEnumerator GetEnumerator () { return ( IEnumerator ) new ArrayImparEnumerator ( this ) .. . o El resultado mostrado por pantalla ser´ ıa: 1 3 5 7 9 11 13 15 17 19 Iterando.

. pueden ser tratadas de una forma m´s eficiente por parte del compia lador. Una a o a propiedad con este modificador de acceso s´lo puede ser accedida desde c´digo perteneciente o o al mismo ensamblado en el que se haya definido dicha propiedad. i < 10. a = a .5: Implementaci´n de un iterador o o Tratando ahora la cuesti´n referente a la ocultaci´n de informaci´n en los casos en los o o o que existe herencia diremos que en tales situaciones se viola el principio de caja negra. } publoc object Current { get { return a [ indice ]. } public void Reset () { indice = -1. que est´ permitida en C++. a [ i ] + " ") . return ( indice <= 9) . a [ i ] = 2 * i + 1.. } class ArrayImparTest { public static void Main () { ArrayImpar ai = new ArrayImpar () . Console . Este tipo de ı clases. llamadas selladas. Sin embargo. no es soportada en C#. Write ( elemento + " ") .36 Tema 4. pues puede ocurrir que una subclase apoye algunos de sus m´todos en la implementaci´n concreta e o conocida de la clase base. i ++) { ai .1. for ( int i = 0. indice = -1. } Console . private ArrayImpar a .2 existe otro m´s: internal. La herencia privada. e a o Adem´s de los tres tipos de acceso vistos en la secci´n 2. ya que sus m´todos no pueden ser redefinidos y por tanto se declaran autom´ticamente e a como no virtuales. WriteLine ("\ nIterando .") . . a s´ se puede inhabilitar la herencia de una clase mediante la palabra clave sealed. todas sus subclases que hayan actuado de la manera anteriormente indicada se ver´n afectadas y a probablemente tambi´n deber´n modificar su implementaci´n. } } private int indice . pues si modificamos la clase base. ´ Este es un factor negativo para la extensibilidad. Herencia 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 { this . } public bool MoveNext () { indice += 2. } } C´digo 4. Write ( ai . foreach ( int elemento in ai ) Console .

u 4. Problemas: Colisi´n de nombres y herencia repetida o Aunque la herencia m´ltiple nos ofrece varias ventajas a la hora de programar seg´n la u u metodolog´ OO.11 La figura 4.7 Herencia m´ ltiple u 37 4. Herencia m´ ltiple u Definici´n 4. este hecho se solventa mediante la herencia m´ltiple de interfaces u y simple de clases. a .(a) muestra un ejemplo de herencia simple. Sin ema u bargo.6.(b) hace lo propio con la herencia m´ltiple. e ´ a La colisi´n de nombres tiene lugar cuando una clase hereda de dos o m´s clases un o a m´todo con el mismo nombre y diferente implementaci´n. u (a) (b) Figura 4.13 En la figura 4.7. como veremos m´s adelante. tambi´n implica algunos inconvenientes. no est´ permitida la herencia m´ltiple de clases.1. a Ejemplo 4.6. al igual que en Java. e o Ejemplo 4.12 En el c´digo 4. no se da en C#).7 se muestra un ejemplo de colisi´n de nombres debida a la o herencia m´ltiple. u Figura 4.10 Se dice que existe herencia m´ltiple de clases (tambi´n puede ser de intero u e faces) cuando una clase hereda directamente de m´s de una clase. a diferencia de C++. ıa e A continuaci´n explicaremos dos de ellos: la colisi´n de nombres y la herencia repetida o o (aunque ´sta ultima. Ejemplo 4.5 se muestra un claro ejemplo de o ı herencia m´ltiple de interfaces.6: Herencia simple y m´ltiple u En C#.7.4 as´ como en la figura 4. mientras que la figura 4.4.7: Herencia m´ltiple y colisi´n de nombres u o La herencia repetida se da cuando una misma propiedad es heredada por distintos caminos m´s de una vez.

6 se muestra un ejemplo en el que una clase C hereda de dos o interfaces distintas A y B un m´todo con el mismo nombre f(object o). como ya hemos dicho. resultando en una e ambig¨edad de nombres. si difieren en la signatura y/o en el valor de retorno.8 se muestra un ejemplo de herencia repetida debida a la herencia m´ltiple.7. 2. Es m´s. } class C : A . f () ?? public void g () { f () . } A . Sobrecarga.7.38 Tema 4..8: Herencia m´ltiple y herencia repetida u Ejemplo 4. } } C´digo 4. f () o B . Herencia Figura 4. tambi´n podemos a e implementar un m´todo f() en C para el caso en el que se manipulen directamente objetos e de dicha clase. Estos cambios pueden observarse en el c´digo 4. pero s´ puede darse colisi´n de ı o nombres en el caso en el que una interface hereda de dos o m´s interfaces un m´todo con el a e mismo nombre.15 En el c´digo 4. o 4.. u En C#.. } C´digo 4. B { // A . } B .7: Soluci´n a la ambig¨edad de nombres o o u . Ejemplos de utilidad Ejemplo 4. Compartici´n. u 1 2 3 4 5 6 7 8 9 10 11 12 interface A { void f ( object o ) .14 En la figura 4. B void void void { f ( string s ) { ..2.6: Ambig¨edad de nombres debida a la herencia m´ltiple o u u Podemos resolver la potencial ambig¨edad de nombres dentro de la clase C incluyendo u declaraciones expl´ ıcitas para cada instancia de interface heredada. no hay herencia repetida. } interface B { void f ( object o ) . o 1 2 3 4 5 class C : public public public } A. si tienen la misma signatura y valor de retorno.. f ( object o ) { .. f ( object o ) { . En este caso existen dos posibilidades: 1.

pues como ya vimos en el ejemplo 4. Java y C++: Estudio comparativo Adem´s de las continuas referencias que durante todo el texto se han hecho hacia otros a lenguajes OO como Java y C++. Figura 4. e Ejemplo 4. En esta circunstancia podr´ ıamos pensar que se dar´ un caso de herencia repetida. Normalmente el recolector de basura (garbage collector ) se encarga autom´ticamente de los objetos que ya no son necesarios (por ejemplo. podr´ ıamos pensar que bajo estas premisas nos encontramos ante un caso de herencia m´ltiple.16 Sea la jerarqu´ mostrada en la figura 4. ´ e 4. C#. Java y C++: Estudio comparativo 39 Ejemplo 4. pues ya hereda dichas e implementaciones de la clase X. No obstante s´ deber´ implementar aquellos m´todos de la ı a e interface Y que no est´n en la interface W. a continuaci´n se muestran s´lo algunas comparaciones o o entre dichos lenguajes y C#. se puede solucionar f´cilmente.10: Herencia m´ltiple sin herencia repetida (II) u Si bien es cierto que la clase Z hereda los m´todos de la interface W por dos v´ no resulta e ıas.10. a Otra soluci´n distinta a la expuesta en el ejemplo 4.15. esto ser un problema. Al igual que en el ejemplo ıa anterior. C# es muy parecido a Java.15 pero igualmente v´lida consiste en o a implementar una unica vez cada m´todo “repetido”.9. Pero. al igual que en el ejemplo anterior esto no es as´ u ı. clases. los no a . Figura 4.9: Herencia m´ltiple sin herencia repetida (I) u La clase Z no necesita implementar los m´todos de la interface W.17 Sea ahora la jerarqu´ mostrada en la figura 4.8 C#. Las letras enmarcadas representan ıa interfaces y las no enmarcadas. pero ıa no es as´ ı.4.8.

Toda clase tiene como clase base de su jerarqu´ a ıa la clase object. o . Los tipos primitivos tales como int pueden ser tratados como objetos. C# incorpora la instrucci´n foreach junto con la interface IEnumerator. Ofrece demasiadas oportunidades al programador de manejar err´neamente los punteros en aras de la eficiencia. lo cual pero mite la construcci´n de un iterador. En C# existe el concepto de propiedades. C# tiene verdaderos arrays multidimensionales. aunque de una forma m´s l´gica y simple. Un programador de C# puede convertir r´pidamente su c´digo a Java.40 Tema 4. No est´ preparado para la Web. Herencia referenciados por ninguna variable). C# permite paso por referencia en los tipos primitivos. lo cual proporciona los m´todos de acceso get y set para consultar y modificar los valores de los miembros e de datos de una clase. No es este el caso de Java donde los tipos primitivos son estrictamente “tipos valor”. El mero hecho de que el n´cleo de C# est´ desprovisto del u e tipo puntero simplifica enormemente su compresi´n por parte de un estudiante de POO. De hecho Java es conceptualmente un subconjunto de C#. En C# todo es un objeto. C++ es muy complejo e inseguro. No maneja la memoria a como lo hacen C# o Java. la habilidad de C++ para a o sobrecargar operadores. pero no a la a o inversa. o C# ha retenido. o C++ es dependiente del sistema.

. . . Herencia e implementaci´n de interfaces . . Herencia m´ltiple y herencia repetida . . . . Herencia m´ltiple sin herencia repetida (I) . . Ejemplo de variables id´nticas . . . . . . . . . . . . . . . . Jerarqu´ de clases . . Ejemplo de copia profunda . . . . . . . Ejemplo de estructura de datos polimorfa . . . . . . . . . . . . . . . . . . . . .3. . . .10. . . . . . 2. . . .7. . .5. . . . . . . . . . . . . . . . . . . . . . 2.8. . . . . . . . . . . .6. . . o e 4. . e . . 2.5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ıa 4. u o 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .´ Indice de Figuras 2. . . . . . . . . . . . . . . 4. . . . . . . 2. . . . . . . . . . . . . . . . . . . . . 8 11 11 11 12 12 13 25 26 29 30 33 37 37 38 39 39 4. . . . . . . . 2. . . . . . . . .4. . .1. . . . . . . Variables tipo “puntero” en los lenguajes tradicionales Variables en los lenguajes OO . . . . . . . Herencia y redefinici´n de m´todos . . . . . . . Ejemplo de copia superficial . . Herencia m´ltiple sin herencia repetida (II) . . . . .3. . . . . . . . . . . . Herencia de especializaci´n y de implementaci´n o o 4. .6. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2. . . . . . .1. . .4.7.9. . . . . . Clientela y Herencia entre A y B . . . . . . . . . . . u 4. . u 4. . . . . . . . . . . . . . . . . . . . . . . . Herencia m´ltiple y colisi´n de nombres . . . .2. . . . . . . o 4. . . . . . u 4. . . . . . . . . . . . .2. . . . . Herencia simple y m´ltiple . . . . . u 41 . . Variables en los lenguajes tradicionales . . . .

42 ´ INDICE DE FIGURAS .

. . . . . . . Algunas Excepciones est´ndar .1. . 2. .2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Propiedades de las excepciones . .2. . . . . . . . . 4. . .3. . . 6 6 6 6 19 19 26 27 27 3. . . . . . . . . . . . . . . . . . . . . . . . Propiedades de las excepciones . . . . . . . . . . . . . . . 4. . . . . . . . . . . . . . . . . . . . . . . a 3. . . . . . . . . . 2. . . . . . . 43 . . 4.1. . . . . . . Operadores binarios “sobrecargables” . . . . Operadores unarios “sobrecargables” . 2. . . . . . .´ Indice de Tablas 2.3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos flotantes primitivos Otros tipos primitivos . . . . . . .4. . . . . . Palabras reservadas . . . . . . . . . . . . . .1. . . . . . . Tipos enteros primitivos . . .2. . . . . . . .

44 ´ INDICE DE TABLAS .

. . . . . . Ejemplo de Constructores . . . . . . . . . .´ Indice de C´digos o 2. . . . . . .3. . . . . . e Ejemplo del uso de asertos . Ejemplo de Sobrecarga de Operadores .4. . . . . . . . . .4.7. . . 2. . . o o Otro ejemplo de Ocultaci´n de Informaci´n . . . . 2. . . . . . . . . . . . . . . 5 7 8 9 12 13 14 18 18 20 21 22 28 31 31 33 35 38 38 45 . . . . . . . . . . . . . .6. . . .6. . . . . . . . . . . . . . 4. Ejemplo del uso de excepciones . . . . . . . . . . . . . . . . . . . . . . . . . Clase Luna . . . . . . . .2. . Ejemplo del relanzamiento de excepciones . . . . . . . . o e Lista gen´rica doblemente enlazada . . . . 4. . . . . . . Uso de excepciones con m´s informaci´n . . . . . . . . . . 3. . . . . . . . . . . . . . .1. . . . .3. . . . Ejemplo de Ocultaci´n de Informaci´n . . . . . . . . . . . . . . . Herencia M´ltiple mediante interfaces . . . . . . . . . . . . . . . . . . . .1. . . . . . . . . . 2. . . . . . . . . . . 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2. . . . . . . . . .5. 3. . . . . . . . . . . . . 2. . . . . . . . . . 4. . . . 4.5. . . . . . . . . . . .2. 4. . 4. . . .2. . . . 3. . . . . . u Implementaci´n de un iterador . . . . . . . . . . . o e Clase abstracta Figura . . . . .5. . . . . . . . 4. . . . Ejemplo de implementaci´n del m´todo Clone() . . . . . . . . o Ambig¨edad de nombres debida a la herencia m´ltiple u u Soluci´n a la ambig¨edad de nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Redifinici´n de un m´todo heredado . . . . . . . . 3. . . . . . .1. . .7. . . . .3. . o u . 3. a o Ejemplo del uso de excepciones en vez de asertos . . . . . . . .4. . . . . . . . o o Ejemplo de Clases Anidadas . . . . . . . .

46 ´ ´ INDICE DE CODIGOS .

Addison Wesley.Bibliograf´ ıa [Lip02] Stanley B. 47 . 2003. A Practical Approach. Lippman. ıa o [Poh03] Ira Pohl. [Mol04] J. Apuntes de programaci´n orientada a objetos. 2002. 2004. University of California. C# by Dissection. Garc´ Molina. Addison Wesley. C# Primer.

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->