Apuntes Universidad de Chile Programacion Orientada a Objetos 00

download Apuntes Universidad de Chile Programacion Orientada a Objetos 00

of 73

Transcript of Apuntes Universidad de Chile Programacion Orientada a Objetos 00

  • iUniversidad Austral de ChileFacultad de Cs. de la Ingeniera

    Instituto de Informatica

    Apuntes de ClasesINFO 161 : Lenguajes de Programacin

    Programacin Orientada a Objetos

    Prof. Luis Alberto Alvarez Gonzlez

    Valdivia, Agosto de 1998.-

  • ii

    Tabla de Contenidos

    1 INTRODUCCIN. 1

    1.1 DISEO DIRIGIDO POR RESPONSABILIDADES 9

    2 CLASES. 14

    2.1 CREACIN DE OBJETOS DE UNA CLASE. 172.2 FUNCIONES EN LNEA 192.3 CONSTRUCTORES 212.4 DESTRUCTORES. 242.5 FUNCIONES AMIGAS 272.6 EJERCICIOS . 30

    3 MS CONCEPTOS SOBRE ORIENTACIN A OBJETOS 31

    3.1 RELACIONES . 313.1.1 RELACIN UN - TIPO - DE (A - KIND - OF RELATIONSHIP) 313.1.2 RELACIN ES UN(A) ( IS - A RELATIONSHIP) 333.1.3 RELACIN PARTE - DE 343.1.4 RELACIN TIENE - UN 353.2 HERENCIA 353.3 HERENCIA MLTIPLE 383.3.1 CLASES ABSTRACTAS 413.3.2 EJERCICIOS 43

    4 HERENCIA EN C++ 46

    4.1 TIPOS DE HERENCIA . 474.2 CONSTRUCCIN 484.3 DESTRUCCIN 494.4 HERENCIA MLTIPLE . 504.5 POLIMORFISMO 504.6 CLASES ABSTRACTAS 53

    5 SOBRECARGA DE OPERADORES 55

    6 TIPOS GENRICOS 60

    7 TIPOS GENRICOS (TMPLATE EN C++) 63

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 1

    1 Introduccin.

    Envo de FloresSi mando flores a una dama tengo las siguientes alternativas.Alternativas

    1. Lo hago directamente envindole un mensaje aMargarita la florista.

    2. Usando otro objeto intermedio, por ejemploGertrudis, la secretaria.

    El objeto Margarita y el objeto Gertrudis tienen mtodos queentienden el mensaje.

    El objeto Margarita tiene mtodos que permiten realizar laaccin.

    Si le pido a mi jefe Lalo que mande flores, probablementeno lo har porque no tiene el mtodo.

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 2

    En POO, la accin se inicia mediante la transmisin de unmensaje (paso de mensajes) a un agente (objeto)responsable de la accin.

    El mensaje tiene codificada la peticin y se acompaa deinformacin adicional.

    Si el objeto receptor acepta el mensaje, significa que tienelos mtodos para llevarla a cabo.

    El objeto receptor realiza la accin.

    Si hubiese ido donde la florista Rosa el resultado habra sidoel mismo, porque Margarita y Rosa pertenecen a la mismaclase. Esta clase la podemos llamar Florista.

    Todos los objetos de una misma clase tienen los mismos mtodos.

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 3

    Probablemente Margarita pedir dinero y entregar unaboleta, porque ese mtodo los usan todos los comerciantes, osea la clase florista pertenece a una clase mayor llamadacomerciante y el objeto Margarita, conoce los mtodos de laclase florista y todos los mtodos de la clase comerciante

    Dicho de otra forma la clase florista hereda mtodos de unaclase jerrquicamente superior.

    Otros comerciantes son los panaderos, fotocopiadores, etc.

    Los comerciantes son humanos, como otro tipo deprofesiones.

    Los Humanos son mamferos,

    Los mamferos son animales,

    Los animales son objetos materiales

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 4

    Objeto Material

    Animal Planta

    Mamfero Flor

    Perro Humano Ornitorrinco

    Comerciante Artista Ingeniero

    Florista Fococopiador

    Pluto Margarita Rosa PedroPablo Ana Orni Clavel

    Herencia.- Las clases se pueden organizar en forma jerrquica por

    herencia. Una subclase heredar los mtodos de una superclase. Una superclase abstracta se usa solo para crear subclases

    no posee objetos.

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 5

    Un problema, los mamferos dan a luz cras vivas.La ornitorrinco Orni es mamfero y pone huevos. As quenecesitamos mtodo que codifiquen excepciones para anularmtodos de las superclases.

    Enlaces de Mtodos. Un mtodo se busca en la clase del objeto, si no se

    encuentra se busca en la superclase y as sucesivamentehasta que se encuentra. Una vez que se encuentra seejecuta o de lo contrario emite un mensaje de error.

    Volviendo al ejemplo.El hecho que yo no conozca con exactitud los mtodos queusar Margarita, se conoce como ocultamiento de lainformacin.

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 6

    Resolver un problema complejo usando tcnicastradicionales, puede volverse muy engorroso, puesto queobliga a conocer variables, registros o parmetros que seusan anteriormente y de igual forma con el cdigo queviene.

    Para resolver ese problema, se usan:

    Procedimientos,

    Procedimientos y funciones permiten ocultar mtodos,permite reutilizacin. Sin embargo la informacin la puedenocultar slo parcialmente.

    Por ejemplo,

    un procedimiento para manejar una pila.

    Interfaz visible . rutinas, iniciar, sacar, meter y tope.

    Se pude usar arreglo, punteros, listas enlazadas etc.

    Los datos de la pila no pueden ser locales, deben sercompartidos, entonces deben ser globales.

    Supongamos un arreglo de nombre pila_de_datos.

    Problemas.

    Todos los programadores deben saber este nombrepara no crear otro igual.

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 7

    Los nombres iniciar, sacar, meter y tope son ahorareservados.

    Mdulos.

    La programacin modular resuelve los problemas anteriorespermitiendo dividir los mdulos en dos partes, una parteprivada y otra pblica. La parte privada es slo accesiblepor las rutinas al interior del mdulo.

    Problemas.

    Que pasa si otros usuarios desean mantener ms deuna pila.

    La programacin modular no permite hacer lainstanciacin de otros ejemplares.

    Tipo de Datos Abstracto.

    Tipo definido por el programador.

    Conjunto de valores (podra ser infinito) y nmero deoperaciones primitivas.

    Los usuarios pueden crear variables para el tipodefinido.

    Ejemplo, definir una pila como TDA y las operacionesiniciar, sacar, meter y tope, como las nicas operacionesvlidas para pila.

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 8

    Los mdulos se usan como implantacin de TDA. El TDAes un concepto.

    Para construir un TDA se debe ser capaz de:

    1. Exportar una definicin de tipo

    2. Proporcionar un conjunto de operaciones.

    3. Proteger los datos asociados, de tal manera que slose puedan usar con las operaciones establecidas.

    4. Crear mltiples ejemplares del tipo.

    Los mdulos estn dirigidos hacia los puntos 2 y 3.

    Los objetos son tipos abstractos de datos.

    Programacin Orientada a Objetos (POO).

    La POO agrega ideas nuevas al concepto de TDA.

    Ellas son

    paso de mensajes. Cambio de enfoque entre hacerlo unomismo invocando el mtodo apropiado o que el objeto lohaga por uno.

    Sobrecarga de nombres

    Reutilizacin de software.

    Mecanismos de herencia y polimorfismo (mtodos quepueden ser aplicados a diferentes objetos)

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 9

    1.1 Diseo Dirigido por Responsabilidades

    Que es POO ?

    Respuesta tpica : clases, herencia, etc., sintaxis del lenguaje.

    Importante, delegacin de responsabilidades. Esta tcnica sellama diseo dirigido por responsabilidades.

    Una tcnica til es el uso de tarjetas CRC (Clases,Responsabilidad, Colaboradores), como se muestra en lafigura

    Nombre de la Clase Colaboradores

    Responsabilidades

    Algunas reglas

    Usar nombre pronunciables.

    Usar el subrayado _ (underline) para separar palabrasdentro de un nombre o usar la primera letra mayscula.Ejemplo Ordenador_de_lista u OrdenadorDeLista

    Usar adecuadamente las abreviaturas, por ejemploordlist no es un buen ejemplo, sin embargo IDuser

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 10

    podra ser una abreviatura al nmero de identificacin deusuario.

    No usar dgitos que confundan al lector por ejemplo 0 y O,1 y l, 2 y Z, 5 y S, etc.

    Usar claramente variables boolianas, por ejemploImpresora_Lista es mejor que Estado_Impresora.

    Un ejemplo es el de cajeros automticos

    Lector_de_Tarjetas Colaboradores

    Muestre mensaje de bienvenida, espera tarjetaVerificador_de_NIP

    Pida al Verificador_de_NIP que compruebe validezSelector_de_Actvidad

    Llame al Selector_de_Actvidad

    Devuelve tarjeta a usuario

    Verificador_de_NIP Colaboradores

    Recibe nmero NIP del Manejador_de_cuenta. Manejador_de_cuentaDevuelve falso si no hay cuenta

    Presenta ventana de solicitud de NIP

    Recibe el NIP del usuario

    Compara NIP, devuelve resultado

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 11

    Manejador_de_cuenta Colaboradores

    Verifica valides de cuenta; devuelve NIP

    Verifica informacin retiro/depsito

    Selector_de_actividad Colaboradores

    Muestra men de actividades Manejador_de_depsito

    Espera seleccin del usuario Manejador_de_retiros

    Llamar al manejador de la transaccin adecuada

    Manejador_de_Retiros Colaboradores

    Pregunta al usuario la cantidad a retirar Manejador_de_cuenta

    Verifique la cantidad con Manejador_de_CuentaDistribuidor_de_efectivo

    Diga al Distribuidor_de_efectivo que descargue efectivo

    Caja_electrnica Colaboradores

    Dar efectivo Manejador_de_retiros

    Dar sobre de depsitos con indicacin de horaManejador_de_depsitos

    Recuperar sobre del depsito.

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 12

    Ejemplos.-

    Organizacin de escuela. profesores, alumnos, director, inspector, auxiliar, jardinero.

    Industria. Gerente, asesores, secretaria, Ingenieros, tcnicos, trabajadores,

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 13

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 14

    2 Clases.

    Un objeto es una instancia de una clase.

    Un objeto tiene un estado y uno o varios mtodos.

    La estado es privado y puede ser accesado solo su propiosmtodos.

    Objeto

    Una clase, es a la cual pertenecen los objetos.

    Por lo tanto.

    Una clase tiene una parte pblica y una parte privada.

    La parte privada tiene que ver con el estado del objeto.

    La parte pblica es la interfaz al objeto.

    estado

    mtodos

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 15

    Ejemplo

    class Point {private :

    int xVal, yVal;public:

    void SetPt( int , int);void OffsetPt( int , int);

    };

    Se declara una clase llamada Point .

    Tiene cuatro componente. xVal , yVal , SetPt yOffsetPt .

    Tiene dos datos miembros y dos funciones miembros.

    La parte privada est compuesta por los datos miembros.

    La parte pblica esta compuesta por las funcionesmiembros y la forma en como podr accesarse los objetos.

    No importa el orden de la parte pblica y privada.

    Si la primera parte es la privada, se puede omitir private .Es decir quedara.

    class Point {int xVal, yVal;

    public:void SetPt( int , int);void OffsetPt( int , int);

    void PrintPt() ;};

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 16

    El encabezado de las declaraciones de las funcionesmiembros deben ser de la siguiente forma :

    tipo clase :: funcin (parmetros)

    por ejemplo

    void Point::SetPt( int x, int y) {xVal=x;yVal=y;

    }

    void Point::OffsetPt( int x, int y) {xVal+=x;yVal+=y;

    }

    Esto se lee : De la clase Point se declara setPt como...

    La funcin setPt asigna los valores x e y a los valoresprivados xVal, yVal.

    La funcin OffsetPt le agrega a xVal e yVal , losvalores de x e y .

    O sea xVal+=x; equivale a xVal=xVal+x;

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 17

    2.1 Creacin de Objetos de una clase.

    Se hace de la misma que la declaracin de los tiposconcretos, por ejemplo,

    Point punto_1, punto_2, xy, pt;

    aqu, punto_1 , punto_2, xy y pt , son objetos de laclase Point .

    Point .

    punto_1 punto_2 xy pt

    Se pueden crear infinitos objetos de una clase.

    Se puede accesar un mtodo pblico de un objeto, de lasiguiente manera.

    objeto.mtodo(parmetros);

    Por ejemplo a un objeto lo podemos fijar en un punto

    pt .SetPt(10,10);

    y posteriormente lo podemos incrementar en 2 unidades en xe y, o sea

    pt .OffsetPt(2,2);

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 18

    Aqu estamos trabajando con el objeto pt .

    Intentar accesar un dato privado es ilegal, por ejemplo

    pt.xVal=10; // ilegal

    Otro ejemplo,

    Supongamos la clase fecha

    class fecha {int mes, dia,agno;

    public:void fijar( int , int,int);void siguiente();void imprimir();

    };

    con las siguientes definiciones,

    void fecha::fijar( int d,int m, int a) {dia=d;mes=m;agno=a;

    }

    void fecha::siguiente() {dia++;if( dia>28)....

    }

    void fecha::imprimir() {cout

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 19

    }Si definimos un objeto hoy, por ejemplo,

    fecha hoy ;

    Como poder obtener el dia , mes y agno del objeto hoy ?

    Respuesta.

    El dia , mes y agno de hoy son privados. Por lo tanto lanica forma es a travs de una funcin miembro. Tendremosentonces que agregar una funcin miembro a la clase.

    Llamemos a esta funcin obtener

    En la clase deber definirse de la siguiente forma :

    void obtener( int* , int*,int*);

    Cual deber ser su declaracin.?

    Tarea: Hacer un programa que cree el objeto hoy de la clasefecha. Fije el objeto hoy en 25 de abril de 1996, acontinuacin incremente hoy al da siguiente y muestre elcontenido sin usar el mtodo imprimir y usndolo.

    2.2 Funciones en lnea

    Cuando un mtodo se declara en la misma definicin de laclases se dice que esta en lnea, del ejemplo

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 20

    class fecha {int mes, dia,agno;

    public:void fijar( int d, int m, int a)

    {dia=d; mes=m; agno=a;}void siguiente();void imprimir() { cout

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 21

    2.3 Constructores

    Supongamos que declaramos un objeto pt de la clasePoint y posteriormente, invocamos el mtodos OffsetPte imprimimos el resultado. Que ocurre ?

    Point pt;pt.OffsetPt(2,2);pt.PrintPt();

    O creamos el objeto hoy de la clase fecha y acontinuacin invocamos el mtodo siguiente() eimprimimos la nueva fecha.

    fecha hoy;hoy.siguiente();hoy.imprimir();

    Se debe entonces, declarar el objeto e inmediatamentedespues inicializarlo, O sea,

    Point pt;pt.set(10,10);

    y

    fecha hoy;hoy fijar(26,4,96)

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 22

    Para que evitar cualquier olvido, el objeto debera poderinicializarse al momento de su declaracin.

    Por ejemplo

    Point pt(10,10);y

    fecha hoy(26,4,96);

    Como debera definirse la clase para que esto ocurra ?

    Si se declara un mtodo pblico con el mismo nombre de laclase, entonces se puede realizar.

    El mtodo con el mismo nombre de la clase y que tienecomo objetivo inicializar los objetos que se declaren de laclase se llaman constructores.

    As la clase quedara

    class Point {int xVal, yVal;

    public:Point( int x, int y) { xVal=x; yVal=y;}void OffsetPt( int,int);

    void PrintPt() ;};

    Notas :

    El constructor esta declarado en lnea, pero no esnecesario.

    El constructor no debe estar precedido por algn tipo ovoid.

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 23

    De esta forma ahora podemos declarar,

    Point pt(10,10), pt1(0,0), pt2(1,3);y

    fecha hoy(26,4,96), eclipse(5,5,96);

    Sera interesante poder usar la misma clase para crearobjetos que permitan manejar puntos en coordenada polaresu otras.

    De igual forma poder escribir las fechas de distinta manera.

    Para resolverlos se puede hacer uso de la sobrecarga yescribir varios constructores uno para cada caso.

    Por ejemplo

    class Point {int xVal, yVal;

    public: Point( int x, int y)

    {xVal=x; yVal=y;} Point() {xVal=yVal=0;}

    void OffsetPt( int,int); void PrintPt() ;};

    Point::Point( float radio , float angulo) {xVal=( int) ( radio*cos( angulo));yVal=( int) ( radio*sin( angulo));

    };

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 24

    Note que como xVal e yVal son declarados enteros, esnecesario que la operacin sea convertida finalmente aenteros.

    Podemos crear los siguientes objetos

    Point pt(10,10), pt1(0.0,0.0), pt2;

    As

    pt trabaja en coordenadas cartesianas,

    pt1 en coordenadas polares y

    pt2 en coordenadas cartesianas pero se inicializa con 0.

    De igual manera con los objetos de la clase fecha .

    Se podra ingresar fecha de distintas maneras, por ejemploen forma int dia,char* mes, int* agno.

    2.4 Destructores.En algunos casos los objetos creados, necesitan espacio enmemoria adicional, el cual debe ser creado en la funcinconstructor, por ejemplo crear un arreglo,

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 25

    class vector {int tamagno;int* v;.

    public:vector( int); // constructor..

    }

    donde

    vector::vector( int t) {tamagno=t;v=new int[t]; // asigna espacio a

    // un arreglo de t// enteros

    }

    Sin embargo, una vez que se deja de usar un objeto, se puedeliberar la memoria que usar, para ello se usa un destructor.

    Los destructores tiene el mismo nombre de la clase peroestn precedidos por un tilde (~)

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 26

    ejemplo

    class vector {int tamagno;int* v;.

    public:vector( int); // constructor~vector(); // destructor.

    }

    donde

    vector::~vector() {delete [] v; // libera el espacio

    // que ocupaba el// arreglo al que// apunta v

    }

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 27

    2.5 Funciones Amigas

    Supongamos las clases vector y matriz . El vector de 4elementos y la matriz de 4 columnas o vectores. El acceso acada uno de los elementos, se obtiene con la funcinelem().

    Si se desea multiplicar, se puede construir una funcin queno pertenezca a ninguna de las clases y lo permita,esto sera,

    vector multiplicar( const matriz& m, const vector& v) {vector r;for( int i=0;i

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 28

    Solucin. En la definicin de clases debe existir forma dedeclarar una funcin que no pertenezca a la clases, pero quesi tenga acceso a la parte privada de los objetos de la clase.

    Las funciones as declaradas, se llaman funciones amigas yse declaran de la siguiente forma

    class matriz;

    class vector {float v[4];// ..friend vector multiplicar( constmatriz&,

    const vector&);}

    class matriz {vector v[4];// ..friend vector multiplicar( constmatriz&,

    const vector&);}

    Una funcin friend puede ser puesta tanto en la parteprivada como en la pblica.

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 29

    Luego la funcin friend queda como sigue,

    vector multiplicar( const matriz& m,const vector& v) {

    vector r;for( int i=0;i

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 30

    2.6 Ejercicios.

    1. Escribir programas completos con las clases Point y Fecha,sin usar constructores y usndolos.

    3. Defina una clase letra que tenga como funciones: escribir_letra imprima las letras a`, ..,` z` y los

    dgitos 0,..,9 escribir_ascii que imprima sus valores enteros, y escribir_hexa utilizando notacin hexadecimal.

    4. Cuales son nombre apropiados para clases, objetos ymtodos : Imprimir, raiz_cuadrada, complejo,ao_bisiesto, fecha, hora.

    5. - Escriba definiciones para las clases: complejo, vector,matriz.

    6. - Escriba las declaraciones de todas las funcionesmiembros de las clases anteriores. Use Constructores.

    7. - Escriba pequeos programas completos, donde se creenobjetos de las clases anteriores y se pueda usar cada unode los mtodos o funciones miembros de los objetos.

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 31

    3 Ms Conceptos sobre Orientacin a Objetos

    3.1 Relaciones.

    3.1.1 Relacin Un - Tipo - De (A - Kind - OfRelationship)

    Consideremos que tenemos que escribir un programa paradibujar varios objetos tales como puntos, crculos,rectngulos, tringulos etc.

    Para cada objeto debemos tener una clase. Por ejemplo, siusamos un pseudo lenguaje para definir la clase punto,tenemos :

    class Punto {atributos :

    int x, ymtodos:

    fijarX( int nuevoX)obtenerX()fijarY( int nuevoY)obtenerY()

    }

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 32

    Si continuamos definiendo una clase para definir crculostenemos,

    class Circulo {attributos :

    int x, y, radiomtodos:

    fijarX( int nuevoX)obtenerX()fijarY( int nuevoY)obtenerY()fijarRadio( int nuevoRadio)obtenerRadio()

    }

    Donde x e y define el centro de los objetos de circulo.

    Si comparamos ambas clases se observa lo siguiente:

    Ambas clases tienen los elementos x e y. En la clasePunto, estos describen la posicin del punto, en la claseCirculo, estos describen el centro del circulo. As x e y,tienen el mismo significado; en ambas clases describen, atravs de un punto, la posicin del objeto asociado.

    Ambas clases ofrecen el mismo conjunto de mtodos parafijar y obtener x e y.

    La clase Circulo agrega un nuevo elemento llamado radioy los mtodos de acceso correspondiente.

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 33

    Conociendo las propiedades de la clase Punto, se puededescribir un crculo como un punto + un radio y los mtodosde acceso de este. De esta forma

    un crculo es A - Kind - Of punto.(un circulo es un tipo de punto)

    Sin embargo, un crculo es un poco ms especializado.

    La relacin A - Kind - Of es usada a nivel de clasesPara esta relacin comnmente se usa

    Las clases encerradas dentro de rectngulos. El nombre de la clase comienza con mayscula El sentido de la flecha indica la relacin A - Kind -

    Of.

    3.1.2 Relacin Es Un(a) ( Is - A relationship)Si creamos objetos de tales clases, su relacin ser Es -Un(a) (Is - A).

    Ya que la clase Circulo es un tipo de Punto, un objeto deCirculo, digamos circulo es un punto.

    Consecuentemente, cada crculo se comporta como unpunto. Por ejemplo, un punto se puede mover en la direccin

    Crculo PuntoA - Kind - Of

    Un - Tipo - De

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 34

    x alterando el valor de x. De manera similar se puede moverun crculo.

    Para representar la relacin Es - Un se usar :

    Los objetos se escribirn con letra minscula. Los rectngulos tendran las esquinas redondeadas.

    3.1.3 Relacin Parte - DeAlgunas veces se necesita construir un objeto paracombinarlo con otros. En la programacin procedural sepuede usar estructuras o records.

    Supongamos que se han creado varias clases para diferentesfiguras, entre ella Circulo y Triangulo .

    Si decidimos crear una figura especial para representarnuestro logo, que consiste de un crculo y un tringulo.

    As nuestro logo tendr dos partes, crculo y tringulo queson Parte - De nuestro logo, es decir:

    circulo puntoIs - A

    Es - Un

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 35

    class Logo {atributos :

    Circulo circuloTriangulo triangulo

    mtodos:fijarLogo(Punto donde)

    }

    3.1.4 Relacin Tiene - UnEsta es la relacin inversa de la relacion Parte - De

    3.2 HerenciaCon la herencia podemos usar la relacin A - Kind - Ofpara clases y la relacin Is - A para objetos.

    Las clases que son A - Kind - Of otra clase compartepropiedades de las ltimas. Por ejemplo si se declara la claseCirculo como heredada de Punto, se tiene:

    Circulo TrianguloLogoParte - DeParte - De

    Circulo TrianguloLogo

    Parte - De Parte - De

    Tiene - Un Tiene - Un

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 36

    class Circulo heredada de Punto {atributos :

    int radiometodos:

    fijarRadio( int nuevoRadio)obtenerRadio()

    }

    La clase Circulo hereda todos los atributos y mtodos de laclase Punto, por lo tanto no necesita definir los atributos ymtodos Punto.

    A nivel de objetos, un circulo, podra usar un punto, porqueun circulo es un punto. Por ejemplo se puede definir unobjeto circulo y fijar su centro se la siguiente forma :

    Circulo acirculoacirculo.fijarX(1) // heredada de Puntoacirculo.fijarY(2)acirculo.fijarRadio(3) // agregada a Circulo

    La relacin Es un implica que podemos usar un circulo encualquier parte donde exista un punto.

    Por ejemplo si escribimos una funcin llamada mueve, quepermite mover un punto en la direccin x

    mueve(Punto apunto, int delta_x) {apunto.fijaX( apunto.obtenerX()+ delta_x)

    }

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 37

    Un circulo heredado de punto puede usar un crculo comoargumento, para mover el punto centro.

    Circulo acirculo...move(acirculo ,10) // mueve el circulo

    // moviendo el punto centro.

    Definiciones.-

    Herencia.- Es el mecanismo con el cual una clase A heredalas propiedades de la clase B. Se dice A es heredada de B.Los objetos de la clase A tiene acceso a los atributos ymtodos de la clase B sin necesidad de redefinirlos.

    Superclase/Subclase.- Si A es heredada de B, entonces B esllamada superclase de A y A es llamada subclase de B.

    Los objetos de una subclase comparten el mismocomportamiento que los objetos de la superclase.

    Las superclases tambin son conocidas como clases padres oclases base y las subclases como clases hijas o clasesderivadas.

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 38

    Del ejemplo

    3.3 Herencia MltipleUna clase puede ser subclase de mas de una superclase.

    Una subclase por lo tanto puede mesclar las propiedadesheredadas de las superclases.

    Supongamos que existe una clase String que permitemanipilacin de texto. Por ejemplo con un mtodo quepermite agregar otro texto. Si en nuestro programa quedibuja objetos queremos agregar texto.

    Sera interesante que adems podamos podamos mover eltexto en el dibujo.

    Para resolver el problema crearemos una claseString_Dibujable que herede las propiedades dePunto y String .

    Punto

    Circulo

    heredada de

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 39

    En el pseudo lenguaje usaremos coma (,) para separar lasmltiples herencias.

    class String_Dibujable heredada de Punto, String {atributos:

    // todos los heredados de las// superclases

    mtodos:// todos los heredados de las// superclases

    }

    Podemos usar objetos de String_Dibujable como sifueran objetos Punto o String . As

    Punto String

    String_Dibujable

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 40

    String_Dibujable dstring...move(dstring, 10)...

    Esto es posible porque dstring es un punto ( dondepunto es un objeto de Punto )

    Por otro lado si en la clase String existe el mtodo agregarpara agregar texto, o sea tambin podemos hacer,

    dstring.agregar(Esta caja es ...)

    Definicin.-

    Si la clase A hereda de mas de una clase, por ejemplo de B1,B2, ..., Bn, podemos hablar de mltiple herencia. Esto puedeproducir conflictos de nombre si al menos dos de lassuperclases definen propiedades con el mismo nombre.

    El problema de conflicto de nombre puede ser resuelto de lasiguientes dos formas :

    1. El orden en el cual las superclases son provistas.2. La subclase puede resolver el conflicto especificando la

    superclase.

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 41

    Otra forma es usando otra superclase para las clases queheredan.

    Las mltiples herencias son un mecanismo poderoso, sinembargo puede producir conflictos de nombres.

    3.3.1 Clases AbstractasCon herencia forzamos a una subclase a tener las mismaspropiedades que la superclase. Consecuentemente, losobjetos de una subclase tienen el mismo comportamientoque los objetos de la superclase.

    A

    B C

    D

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 42

    En el programa de dibujo, cada objeto deber proveer unmtodo para dibujar su rea. Sin embargo, dibujar un crculoes diferente a dibujar un rectngulo.

    Supongamos el mtodo print(). que fuerce a todos losobjetos dibujables a tener tal mtodo. Para esto definamos laclase Objeto_Dibujable de la cual todos los objetosdibujables heredan sus propiedades :

    abstracta class Objeto_Dibujable {atributos:

    mtodos:print()

    }

    Se introduce la palabra clave abstracta, para especificar quelas heredadas deben re definir el mtodo print().

    As, desde el punto de vista de una clase abstarcta laspropiedades estas especificadas, pero no definidas.

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 43

    Ejemplo

    class Punto heredada de Objeto_Dibujable{atributos:

    int x,ymtodos :

    fijarX( int nuevoX)obtenerX()fijarY( int nuevoY)obtenerY()print() //re definida para Punto

    }

    Definicin.

    Una clase A es llamada abstracta si slo es usada comosuperclase para otras clases. La clase A slo especificapropiedades. Esta no es usada para crear objetos. Las clasesderivadas deben definir las propiedades de A.

    3.3.2 Ejercicios1.- Herencia. Considere los siguientes programas de dibujo.

    a) Defina la clase Rectngulo por herencia de Punto . Elpunto debe indicar la esquina superior izquierda delrectngulo. Cuales son sus atributos. ?. Que mtodosadicionales debe agregar ?.

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 44

    b) Todos los ejemplos anteriores estan basados en dosdimensiones. Si ahora introduce objetos en tres dimensionescomo esferas y cubos. Disee una clase Esfera que use laClase Punto3D. Especifique el rol del punto en unaesfera . Que relacin existe entre la clase Punto yPunto3D ?

    c) Que funcionalidad le da mover() a los objetos 3D ?.Puede usarse.

    d) Dibuje un grafo de herencia que incluya las clasesObjeto_Dibujable , Punto, Crculo,Rectngulo, Punto3D y Esfera.

    e) Fijece en el grfo de la clase Esfera . . Puede lasiguiente ser una definicin ?

    Punto

    Circulo

    Esfera

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 45

    class Esfera heredada de Circulo {atributos :

    int z // agrega tercera dimensin

    mtodos:fijarZ( int nuevoZ)obtenerZ()

    }De razones para ventajas y desventajas de esta alternativa.

    2.- Herencia Mltiple. Compare el grfo de la figura con elde clase. Cuales son las diferencias ?. Que conflictos denombres ocurren ?

    A

    B C

    D

    A

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 46

    4 Herencia en C++

    Asumamos que tenemos la clase Punto como,

    class Punto {int _x, _y;

    public :Punto() {_x=_y=0;}Punto( const int x, const int y)

    {_x=x; _ y=y;}~Punto() {// nada }void fijarX( const int x){_ x=x;}void fijarY( const int y){_ y=y;}int obtenerX(){ return _x;}int obtenerY(){ return _y;}

    }

    La palabra usada anteriormente como heredada de se reemplaza por dos puntos (:).

    Si la clase Punto3D se hereda de la clase Punto se escribe,

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 47

    class Punto3D : public Punto {int _z;

    public :Punto3D(){ fijarX(0) ; fijarY(0);_z=0}Punto3D(const int x,

    const int y,const int z,) {fijarX(x); fijarY(y);_ z=z}

    ~Punto3D() {// nada }void fijarZ( const int z){_ y=z;}int obtenerZ(){ return _z;}

    }

    4.1 Tipos de Herencia.

    En C++ existen dos tipos de herencia :PblicaPrivada

    Si se usa herencia pblica:Todos lo que es declarado privado en la superclase,permanece privado.Todos lo que es declarado pblico en la superclase,permanece pblico.

    Si se usa herencia privada :Todo lo declarado en la superclase (pblico y privado), esprivado en la subclase.

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 48

    4.2 Construccin

    Note que la inicializacin de una instancia de Punto3D sehace usando un constructor, el cual llama los mtodospblicos de Punto para inicializar x e y.

    Sin embargo, podra haberse usado el constructor de Punto ,es decir,

    class Punto3D : public Punto {int _z;

    public :Punto3D() :Punto(){_z=0;}Punto3D(const int x,

    const int y,const int z,): Punto( x,y){_z=z; }

    ~Punto3D() {// nada }void fijarZ( const int z){_ y=z;}int obtenerZ(){ return _z;}

    }

    Si se usan mas superclases, los constructores se separan porcomas.

    Supongamos que la clase Logo esta formada slo por unobjeto de la clase Circulo y otro de la claseRectangulo , entonces, quedara

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 49

    class Logo {Circulo acirc;Rectangulo arec;

    ...public:

    Logo(Circulo c, Rectangulo r): Circulo(a), Rectangulo(r) {}

    ....

    }

    De acuerdo a esto la clase Punto pudo haber sido escrita

    class Punto {int _x, _y;

    public :Punto():_x(0),_y(0) {}Punto( const int x, const int y):_x(x),_y(y){}......

    }

    4.3 Destruccin

    Si un objeto es destruido, los destructores de las superclasestambin son invocados.

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 50

    4.4 Herencia Mltiple.

    Las superclases se separan por comas, ejemplo

    class StringDibujable: public Punto,public ObjetoDibujable {

    ...public:

    StringDibujable(...) :Punto(...), ObjetoDibujable(...)

    { ... }};

    4.5 Polimorfismo

    Es posible crear mtodos virtuales de alguna clase particular,para poder mas tarde se definidos. En C++

    class ObjetoDibujable {public:

    virtual void print();};

    Si ahora declaramos

    class Punto : public ObjetoDibujable {...

    public:void print(){ ... // definicin }

    }

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 51

    De nuevo print() es un mtodo virtual, porque heredaesta propiedad de ObjetoDibujable.

    Si se crea una funcin cualquiera, encargada de dibujar unObjetoDibujable cualesquiera, puede ser definidacomo :

    void desplegar( const ObjetoDibujable&obj) {

    // instrucciones necesarias previasobj.print();

    }

    Cuando se usa mtodos virtuales, algunos compiladoresreclaman, si el destructor de la correspondiente clase no esdeclarado tambin virtual.

    Esto es necesario cuando se usan punteros a una subclase(virtual) y se desea destruir objetos de estos ltimos.

    Si el destructor es virtual, se invoca al destructor del objetoactual referenciado ( y as, recursivamente a todos losdestructores de las superclases). Ejemplo

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 52

    class Color {public:

    virtual ~Color();};

    class Rojo: public Color {public:

    ~Rojo(); // virtualmente heredada de Color}

    class RojoFuerte: public Rojo {public:

    ~RojoFuerte();};

    Si se define paleta como,

    Color *paleta[3];paleta[0]= new Rojo; // dinmicamente crea un nuevo Rojopaleta[1]= new RojoFuerte;paleta[2]= new Color;

    El operador new crea un nuevo objeto del tipo especificadoen memoria dinmica y retorna un puntero de ste. As,new Rojo retorna un puntero a un objeto de la claseRojo y lo asigna al primer elemento del arreglo paleta.Los elementos de paleta son punteros a Color y porqueRojo es-un Color la asignacin es vlida.

    El operador contrario es delete , que explcitamentedestruye un objeto referenciado por un puntero, de estaforma se puede usar

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 53

    delete palette[0];// invoca al destructor ~Rojo y de ~Color()delete palette[1];// invoca a destructor ~RojoFuerte y ~Color()delete palette[2];// invoca al destructor ~Color()

    La invocacin a varios destructores es debido a que losdestructores son virtuales.

    Si los destructores no hubiesen sido declarados comovirtuales slo se habra invocado el destructor ~Color .

    4.6 Clases Abstractas

    Las clases abstractas son definidas como clases ordinarias.Sin embargo, algunos de sus mtodos pueden ser diseadospara que necesariamente deban ser definidos en lassubclases.

    Llamaremos signature o firma al tipo que retorna, nombre yparmetros que usa, pero no a la definicin.

    Ejemplo,

    class ObjetoDibujable {public:

    ...virtual void print()=0;

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 54

    };Con =0 estamos obligando a el mtodo print() seadefinido en la subclase.

    Tambin a este tipo de mtodos se les denomina mtodospuros.

    La clases abstractas contienen slo mtodos puros.

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 55

    5 Sobrecarga de Operadores

    Para tipos definidos por el usuario, es posible re-definir losoperadores establecidos para los tipos concretos, es decir +,-, * , / , etc.

    Por ejemplo supongamos la clase Complejo de la siguienteforma

    class Complejo {double _real, _ imag;

    public:Complejo(): _real(0.0), _ imag(0.0) {}Complejo( const double real,

    const double imag) : _real(real), _ imag(imag) {}

    Complejo suma( const Complejo op);Complejo mul(const Complejo op);...

    };

    Luego si se define

    Complejo a(1.0, 2.0), b(3.5, 1.2), c;

    c=a.suma(b);

    se asigna la suma de a y b a c.Esto es correcto, sin embargo resulta mas entendible usar eloperador +.

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 56

    Afortunadamente C++ permite la sobre carga de operadores.

    De esta forma, usando sobrecarga de operadores se escribe :

    class Complejo {....;

    public:...Complejo operator+( const Complejo

    &op) {double real = _ real+op._real,

    imag = _ imag+op._imag;return(Complejo( real,imag));

    }

    ...};

    Ahora podemos escribir la expresin anterior como :

    c = a + b;

    esto es interpretado como,

    c = a.operator+(b);

    si queremos usar la funcin de la siguiente forma :

    c = operator+( a,b);

    se comete un error porque la sobrecarga del operador no estadefinida con dos argumentos :

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 57

    Por otra parte se dice que por definicin a+b es equivalentea operator+( a, b), por lo tanto se debe definir como,

    Complejo operator+(Complejo a1, Complejo a2) {return complejo(a1._real + a2._real, a1._imag+a2._imag)

    }

    sin embargo, es necesario accesar la parte real y imaginariade un Complejo, por lo tanto una buena definicin sera,

    class Complejo {double _real, _ imag;

    public:double real( return _real);double imag(return _ imag);......

    };

    Complejo operator+(Complejo a1, Complejo a2) {return complejo(a1.real + a2.real, a1.imag+a2.imag)

    }

    Las funciones amigas permiten accesar la parte privada,entonces podra resultar mejor declarar las clase y susoperadores como sigue,

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 58

    class Complejo {double _real, _ imag;

    public:...friend Complejo operator+(Complejo a1,

    Complejo a2 );......

    };

    Complejo :: friend Complejo operator+(Complejo a1,Complejo a2) { return complejo(a1.real + a2.real, a1.imag+a2.imag)}

    ...

    ...

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 59

    La clase completa quedara,

    class Complejo {double _real, _ imag;

    public:Complejo( double r=0, double i=0)

    {_real=r; _ imag=i; }void print();friend Complejo operator+( Complejo,Complejo);friend Complejo operator*( Complejo,Complejo);friend Complejo operator/( Complejo,Complejo);

    };

    voidComplejo :: print(){

    cout

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 60

    6 Tipos Genricos

    Los Tipos de Datos Abstractos (TDA) se usan para definirtipos creados por el usuario. A partir de los cuales nacen lasclases.

    Por ejemplo se puede pensar en una lista de manzanas, autoso cualquier lista.

    La definicin semntica de la lista es siempre la misma.

    Solo cambia el tipo de datos de acuerdo al tipo de lista.

    Esta informacin adicional puede ser especificada por unparmetro genrico el cual es especificado al momento de lacreacin de la instancia..

    De esta forma una instancia de un TDA genrico es unainstancia de una variante particular de un TDA.

    Por ejemplo

    Lista Lista_de_Manzanas

    Los parntesis en ngulos encierran el tipo de dato variantedel TDA Lista .

    Lista_de_Manzanas tiene las mismas interfaces decualquier lista pero funciona con instancias de tipoManzanas.

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 61

    Cuando se define una clase, debemos especificar queestamos definiendo un tipo genrico. Sin embargo no se sabeque tipo de clase se usar.

    O sea, se debe definir una clase con un recipiente donde seindique el tipo de clase.

    La definicin de clase debe proveer un molde (template).

    La clase, de acuerdo a nuestra definicin esta definida paraun tipo particular de objetos.

    Un ejemplo para la definicin para un tipo genrico ser:

    template class Lista T {atributos :

    ... //Datos necesari osmtodos :

    agregar (T elemento)T obtener_primero()T obtener_proximo()...

    }

    La clase anterior es como cualquier clase. Sin embargo laclase lista es declarada como un molde para varios tiposde listas.

    El identificador T es el recipiente.

    Por ejemplo para una lista de manzanas.

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 62

    Lista Lista_de_ManzanasManzanas una_manzana, otra_manzana

    Manzanas.agregar( otra_manzana)Manzanas.agregar( una_manzana)

    La primera lnea declara Lista_de_Manzanas como unalista de Manzanas.

    La definicin anterior es similar a:class Lista {

    atributos :... //Datos necesarios

    mtodos :agregar (Manzana elemento)Manzana obtener_primero()Manzana obtener_proximo()...

    }(Debe haber una definicin de manzanas)

    El compilador debe poder crear diferentes listas es decir:Lista Lista_de_ManzanasLista Lista_de_Autos

    Podemos adicionalmente declarar mas listas de manzanas, esdecir,Lista una_ListaLista otra_Lista

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 63

    Definicin.- (Clase template o molde )

    Si una clase A es parametrizada con un tipo de datos B . Aes llamada una clase molde o clase template. Una vez que secrea un objeto de A, B reemplaza al tipo de datos. Estopermite la definicin de una clase basada en un moldeespecfico para A y el tipo de datos que se indica.

    7 Tipos Genricos (Tmplate en C++)

    Los tipos de datos genrico en C++ se denominan clasestemplates y son similares a las clases normales.

    Ejemplo

    template < class T>class Lista : ... {public:

    ...void agregar( const T dato);...

    };

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 64

    De acuerdo a esto debemos especificar el tipo de lista quedeseamos construir,

    Lista lista-enteros;

    automticamente, el compilador interpreta el mtodo agregarcomo,

    void agregar( const int dato);

    Tambin pueden ser definidas funciones template, porejemplo,

    template < class T>void swap (T &a, T &b) {

    T tmp=a;

    a=b;b=tmp;

    };

    y un posible programa sera

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 65

    int main(){

    int a=3;b=16;

    doublep1=3.14;e=2.17;

    Personayo (Luis Alvarez)tu (Juan Peres)

    swap(a,b);cout

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 66

    ejemplo,

    template < class K, class T>class Diccionario {...public :... K sacar_1( const T palabra_2); T sacar_2( const K palabra_1);...}

    Template tambin puede ser usado para crear clasesparametrizadas, ejemplo.

    template < class T, int tamao>class Stack {

    T _ almacen[tamao];public :...};

    Stack mi_stack;

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 67

    Propiedades de listas simplemente enlazadas.

    1. Elemento actual. Un iterador visita el elemento en uso.

    2. Funcin sucesor. El iterador regresar el prximoelemento a ser visitado.

    3. Condicin de trmino. El iterador debe proveer unacondicin de trmino, no necesita chequear que todos loselementos hayan sido visitados.

    Primer nodo o nodo cabeza. No tiene predecesor.

    Nodo del medio. Tiene predecesor y sucesor.

    ltimo nodo o cola. No tiene sucesor.

    Una lista solo tiene nodos.

    No es posible devolverse ni comenzar en la mitad de la lista.

    Cuales son la operaciones ofrecidas por una lista ?

    La lista tiene dos elementos bien conocidos que son lacabeza y cola.

    l l l l

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 68

    Un nuevo nodo puede ser colocado en la lista como:

    El puntero es fijado en la cabeza,

    en nuevo nodos es la nueva cabeza,

    En forma similar, un nodo puede ser facilmente agregado ala cola como:

    El puntero a la cola es fijado en el nuevo nodo,

    el nuevo nodo pasa a ser la cola.

    La funcion inversa en sacar (o borrar)

    el nodo sucesor pasa a ser la nueva cabeza,

    la antigua cabeza se descarta.

    Tres primitivas permiten hacer lo anterior y son:

    saca-primero : retorna el datos del nodo cabeza,

    saca-ltimo : retorna el dato del nodo cola,

    esta-vaca : retorna verdadero o falso.

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 69

    Implantacin.-El block bsico de una lista es el nodo. As la primera clase adeclarar ser Nodo.

    Lo nico que contiene un nodo is un puntero al prximovecino (a la derecha).Class Nodo {

    Nodo *_derecha;public :

    Nodo(Nodo * derecha=NULL) : _derecha(derecha) {}

    Nodo(const Nodo & val) : _derecha( val._derecha) {}

    const Node *derecha() const{ return _derecha }

    Nodo *&derecha(){ return _derecha }

    Nodo &operador =( const Nodo & val) {_derecha=val._derecha;return * this;}

    const int operator ==( const Nodo & val) const{return _ derecha==val._derecha;}

    const int operator !=( const Nodo & val) const{return !(* this==val); }

    };La palabra const justo antes del cuerpo del mtodo,declara a ste como constante en relacin a los elementos del

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 70

    objeto invocado. Consecuentemente, slo se permite usareste mecanismo en declaracin o definicin respectivamente.

    El modificador const tambin es usado para chequearsobrecarga. De esta forma,

    class Xxx {...int xx() const;int xx() ;

    };

    declara dos mtodos diferentes. El primero es usado encontextos constantes, mientras que el segundo en contextosvariables.

    La clase Nodo implementa un nodo simple donde :

    Constructores. Permiten la definicin de objetosinicializados a partir de otros ya existentes.

    operator =. Cada objetos debe saber como asignar otrosobjetos (del mismo tipo) a si mismo.

    operador ==. Cada objeto deber saber como compararsecon otro objetos.

    operador ! = . Se aplica usando en operador == y elpuntero this .

  • LENGUAJES DE PROGRAMACIN

    Orientacin a Objetos Pgina 71

    De esta forma podemos usarNode a, b;...if ( a!=b)...

    note que se usa el mismo operator == de la clase.

    Todos los nodos deben contener datos. Los datos pueden serde cualquier tipo, para lo cual usaremos una clase template.

    template < class T>

    class Data_Nodo : public Nodo {

    T _data;

    public:

    Data_Nodo(const T data, Data_Nodo

    * derecha=NULL) :

    Nodo(derecha), _data(data) {}

    Data_Nodo(const Data_Nodo &val ) :

    Nodo(val), _data( val._data) {}

    const Data_Nodo *derecha()

    const { return(( Data_Nodo *) Nodo::derecha());}

    ...

    ...