Beruflich Dokumente
Kultur Dokumente
Tabla de Contenidos
1 INTRODUCCIN. 1.1 DISEO DIRIGIDO POR RESPONSABILIDADES 1 9 14 17 19 21 24 27 30 31 31 31 33 34 35 35 38 41 43 46 47 48 49 50 50 53 55
2 CLASES. 2.1 2.2 2.3 2.4 2.5 2.6 CREACIN DE OBJETOS DE UNA CLASE. FUNCIONES EN LNEA CONSTRUCTORES DESTRUCTORES. FUNCIONES AMIGAS EJERCICIOS.
3 MS CONCEPTOS SOBRE ORIENTACIN A OBJETOS 3.1 RELACIONES. 3.1.1 RELACIN UN - TIPO - DE (A - KIND - OF RELATIONSHIP) 3.1.2 RELACIN ES UN(A) ( IS - A RELATIONSHIP) 3.1.3 RELACIN PARTE - DE 3.1.4 RELACIN TIENE - UN 3.2 HERENCIA 3.3 HERENCIA MLTIPLE 3.3.1 CLASES ABSTRACTAS 3.3.2 EJERCICIOS 4 HERENCIA EN C++ 4.1 4.2 4.3 4.4 4.5 4.6 TIPOS DE HERENCIA. CONSTRUCCIN DESTRUCCIN HERENCIA MLTIPLE. POLIMORFISMO CLASES ABSTRACTAS
5 SOBRECARGA DE OPERADORES
6 TIPOS GENRICOS
60
63
ii
LENGUAJES DE PROGRAMACIN
1 Introduccin. Envo de Flores Si mando flores a una dama tengo las siguientes alternativas. Alternativas 1. Lo hago directamente envindole un mensaje a Margarita la florista. 2. Usando otro objeto intermedio, por ejemplo Gertrudis, la secretaria. El objeto Margarita y el objeto Gertrudis tienen mtodos que entienden el mensaje. El objeto Margarita tiene mtodos que permiten realizar la accin. Si le pido a mi jefe Lalo que mande flores, probablemente no lo har porque no tiene el mtodo.
Orientacin a Objetos
Pgina 1
LENGUAJES DE PROGRAMACIN
En POO, la accin se inicia mediante la transmisin de un mensaje (paso de mensajes) a un agente (objeto) responsable de la accin. El mensaje tiene codificada la peticin y se acompaa de informacin adicional. Si el objeto receptor acepta el mensaje, significa que tiene los mtodos para llevarla a cabo. El objeto receptor realiza la accin.
Si hubiese ido donde la florista Rosa el resultado habra sido el mismo, porque Margarita y Rosa pertenecen a la misma clase. Esta clase la podemos llamar Florista.
Todos los objetos de una misma clase tienen los mismos mtodos.
Orientacin a Objetos
Pgina 2
LENGUAJES DE PROGRAMACIN
Probablemente Margarita pedir dinero y entregar una boleta, porque ese mtodo los usan todos los comerciantes, o sea la clase florista pertenece a una clase mayor llamada comerciante y el objeto Margarita, conoce los mtodos de la clase florista y todos los mtodos de la clase comerciante Dicho de otra forma la clase florista hereda mtodos de una clase jerrquicamente superior. Otros comerciantes son los panaderos, fotocopiadores, etc. Los comerciantes son humanos, como otro tipo de profesiones. Los Humanos son mamferos, Los mamferos son animales, Los animales son objetos materiales
Orientacin a Objetos
Pgina 3
LENGUAJES DE PROGRAMACIN
Objeto Material
Animal
Planta
Mamfero
Flor
Perro
Humano
Ornitorrinco
Comerciante
Artista
Ingeniero
Florista
Fococopiador
Pluto
Margarita
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.
Orientacin a Objetos
Pgina 4
LENGUAJES DE PROGRAMACIN
Un problema, los mamferos dan a luz cras vivas. La ornitorrinco Orni es mamfero y pone huevos. As que necesitamos mtodo que codifiquen excepciones para anular mtodos 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 sucesivamente hasta que se encuentra. Una vez que se encuentra se ejecuta o de lo contrario emite un mensaje de error. Volviendo al ejemplo. El hecho que yo no conozca con exactitud los mtodos que usar Margarita, se conoce como ocultamiento de la informacin.
Orientacin a Objetos
Pgina 5
LENGUAJES DE PROGRAMACIN
Resolver un problema complejo usando tcnicas tradicionales, puede volverse muy engorroso, puesto que obliga a conocer variables, registros o parmetros que se usan anteriormente y de igual forma con el cdigo que viene. Para resolver ese problema, se usan:
Procedimientos, Procedimientos y funciones permiten ocultar mtodos, permite reutilizacin. Sin embargo la informacin la pueden ocultar 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 ser compartidos, entonces deben ser globales. Supongamos un arreglo de nombre pila_de_datos. Problemas. Todos los programadores deben saber este nombre para no crear otro igual.
Orientacin a Objetos
Pgina 6
LENGUAJES DE PROGRAMACIN
Mdulos. La programacin modular resuelve los problemas anteriores permitiendo dividir los mdulos en dos partes, una parte privada y otra pblica. La parte privada es slo accesible por las rutinas al interior del mdulo. Problemas. Que pasa si otros usuarios desean mantener ms de una pila. La programacin modular no permite hacer la instanciacin de otros ejemplares.
Tipo de Datos Abstracto. Tipo definido por el programador. Conjunto de valores (podra ser infinito) y nmero de operaciones primitivas. Los usuarios pueden crear variables para el tipo definido. Ejemplo, definir una pila como TDA y las operaciones iniciar, sacar, meter y tope, como las nicas operaciones vlidas para pila.
Orientacin a Objetos Pgina 7
LENGUAJES DE PROGRAMACIN
Los mdulos se usan como implantacin de TDA. El TDA es 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 slo se 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 uno mismo invocando el mtodo apropiado o que el objeto lo haga por uno. Sobrecarga de nombres Reutilizacin de software.
Mecanismos de herencia y polimorfismo (mtodos que
Orientacin a Objetos
Pgina 8
LENGUAJES DE PROGRAMACIN
1.1 Diseo Dirigido por Responsabilidades Que es POO ? Respuesta tpica : clases, herencia, etc., sintaxis del lenguaje. Importante, delegacin de responsabilidades. Esta tcnica se llama diseo dirigido por responsabilidades. Una tcnica til es el uso de tarjetas CRC (Clases, Responsabilidad, Colaboradores), como se muestra en la figura
Nombre de la Clase Responsabilidades Colaboradores
Algunas reglas Usar nombre pronunciables. Usar el subrayado _ (underline) para separar palabras dentro de un nombre o usar la primera letra mayscula. Ejemplo Ordenador_de_lista u OrdenadorDeLista Usar adecuadamente las abreviaturas, por ejemplo ordlist no es un buen ejemplo, sin embargo IDuser
Orientacin a Objetos Pgina 9
LENGUAJES DE PROGRAMACIN
podra ser una abreviatura al nmero de identificacin de usuario. 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 ejemplo Impresora_Lista es mejor que Estado_Impresora. Un ejemplo es el de cajeros automticos
Lector_de_Tarjetas
Muestre mensaje de bienvenida, espera tarjeta Pida al Verificador_de_NIP que compruebe validez Llame al Selector_de_Actvidad Devuelve tarjeta a usuario
Colaboradores
Verificador_de_NIP Selector_de_Actvidad
Verificador_de_NIP
Recibe nmero NIP del Manejador_de_cuenta. Devuelve falso si no hay cuenta Presenta ventana de solicitud de NIP Recibe el NIP del usuario Compara NIP, devuelve resultado
Colaboradores
Manejador_de_cuenta
Orientacin a Objetos
Pgina 10
LENGUAJES DE PROGRAMACIN
Manejador_de_cuenta
Verifica valides de cuenta; devuelve NIP Verifica informacin retiro/depsito
Colaboradores
Selector_de_actividad
Muestra men de actividades Espera seleccin del usuario Llamar al manejador de la transaccin adecuada
Colaboradores
Manejador_de_depsito Manejador_de_retiros
Manejador_de_Retiros
Pregunta al usuario la cantidad a retirar Verifique la cantidad con Manejador_de_Cuenta
Colaboradores
Manejador_de_cuenta Distribuidor_de_efectivo
Caja_electrnica
Dar efectivo Dar sobre de depsitos con indicacin de hora Recuperar sobre del depsito.
Colaboradores
Manejador_de_retiros Manejador_de_depsitos
Orientacin a Objetos
Pgina 11
LENGUAJES DE PROGRAMACIN
Ejemplos.Organizacin de escuela. profesores, alumnos, director, inspector, auxiliar, jardinero. Industria. Gerente, asesores, secretaria, Ingenieros, tcnicos, trabajadores,
Orientacin a Objetos
Pgina 12
LENGUAJES DE PROGRAMACIN
Orientacin a Objetos
Pgina 13
LENGUAJES DE PROGRAMACIN
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 propios mtodos.
Objeto
estado
mtodos
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.
Orientacin a Objetos
Pgina 14
LENGUAJES DE PROGRAMACIN
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 y OffsetPt. Tiene dos datos miembros y dos funciones miembros. La parte privada est compuesta por los datos miembros. La parte pblica esta compuesta por las funciones miembros 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() ; };
Orientacin a Objetos Pgina 15
LENGUAJES DE PROGRAMACIN
El encabezado de las declaraciones de las funciones miembros 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 valores privados xVal, yVal. La funcin OffsetPt le agrega a xVal e yVal, los valores de x e y. O sea xVal+=x; equivale a xVal=xVal+x;
Orientacin a Objetos
Pgina 16
LENGUAJES DE PROGRAMACIN
2.1 Creacin de Objetos de una clase. Se hace de la misma que la declaracin de los tipos concretos, por ejemplo, Point punto_1, punto_2, xy, pt; aqu, punto_1, punto_2, xy y pt, son objetos de la clase 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 la siguiente 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 x e y, o sea pt.OffsetPt(2,2);
Orientacin a Objetos
Pgina 17
LENGUAJES DE PROGRAMACIN
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<<dia<<"/"<<mes<<"/"<<agno<<'\n';
Orientacin a Objetos Pgina 18
LENGUAJES DE PROGRAMACIN
} 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 la nica forma es a travs de una funcin miembro. Tendremos entonces 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 clase fecha. Fije el objeto hoy en 25 de abril de 1996, a continuacin incremente hoy al da siguiente y muestre el contenido sin usar el mtodo imprimir y usndolo.
2.2 Funciones en lnea Cuando un mtodo se declara en la misma definicin de la clases se dice que esta en lnea, del ejemplo
Orientacin a Objetos
Pgina 19
LENGUAJES DE PROGRAMACIN
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<<dia<<"/" <<mes<<"/" <<agno<<'\n';}
};
De esta forma se aumenta la eficiencia de los objetos de la clase. Otra forma de declarar las funciones en lnea es usando la sentencia inline, de esta forma quedara inline void fecha::fijar(int d,int m, int a) { dia=d; mes=m; agno=a; } La declaracin de un mtodo dentro de la definicin ayuda a la eficiencia, pero atenta contra la claridad del programa. Conclusin. Usar funciones en lnea slo cuando la sea muy importante la eficiencia o cuando la definicin sea realmente corta.
Orientacin a Objetos
Pgina 20
LENGUAJES DE PROGRAMACIN
2.3 Constructores Supongamos que declaramos un objeto pt de la clase Point y posteriormente, invocamos el mtodos OffsetPt e imprimimos el resultado. Que ocurre ? Point pt; pt.OffsetPt(2,2); pt.PrintPt();
O creamos el objeto hoy de la clase fecha y a continuacin invocamos el mtodo siguiente() e imprimimos la nueva fecha. fecha hoy; hoy.siguiente(); hoy.imprimir(); Se debe entonces, declarar el objeto e inmediatamente despues inicializarlo, O sea, Point pt; pt.set(10,10); y fecha hoy; hoy fijar(26,4,96)
Orientacin a Objetos
Pgina 21
LENGUAJES DE PROGRAMACIN
Para que evitar cualquier olvido, el objeto debera poder inicializarse 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 la clase, entonces se puede realizar. El mtodo con el mismo nombre de la clase y que tiene como objetivo inicializar los objetos que se declaren de la clase 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 es necesario. El constructor no debe estar precedido por algn tipo o void.
Orientacin a Objetos
Pgina 22
LENGUAJES DE PROGRAMACIN
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 crear objetos que permitan manejar puntos en coordenada polares u otras. De igual forma poder escribir las fechas de distinta manera. Para resolverlos se puede hacer uso de la sobrecarga y escribir 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)); };
Orientacin a Objetos
Pgina 23
LENGUAJES DE PROGRAMACIN
Note que como xVal e yVal son declarados enteros, es necesario que la operacin sea convertida finalmente a enteros. 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 ejemplo en forma int dia,char* mes, int* agno.
2.4 Destructores. En algunos casos los objetos creados, necesitan espacio en memoria adicional, el cual debe ser creado en la funcin constructor, por ejemplo crear un arreglo,
Orientacin a Objetos
Pgina 24
LENGUAJES DE PROGRAMACIN
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 puede liberar la memoria que usar, para ello se usa un destructor. Los destructores tiene el mismo nombre de la clase pero estn precedidos por un tilde (~)
Orientacin a Objetos
Pgina 25
LENGUAJES DE PROGRAMACIN
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
Orientacin a Objetos
Pgina 26
LENGUAJES DE PROGRAMACIN
2.5 Funciones Amigas Supongamos las clases vector y matriz. El vector de 4 elementos y la matriz de 4 columnas o vectores. El acceso a cada uno de los elementos, se obtiene con la funcin elem(). Si se desea multiplicar, se puede construir una funcin que no 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<3;i++) { r.elem(i)=0; for(int j=0;j<3;j++) r.elem(i)+=m.elem(i,j)*v.elem(j); } return r; } {
Desventajas, multiplicar() llama a elem() 4*(1+4*3). Si elem() verifica intervalo => an mas tiempo. Si multiplicar fuera funcin nica de la clase vector y la clase matriz, no habra necesidad de verificar y podra evitarse la funcin elem(). Pero, una funcin no puede ser miembro de dos clases. Recuerde, tipo clase::funcin(parmetros);
Orientacin a Objetos Pgina 27
LENGUAJES DE PROGRAMACIN
Solucin. En la definicin de clases debe existir forma de declarar una funcin que no pertenezca a la clases, pero que si tenga acceso a la parte privada de los objetos de la clase. Las funciones as declaradas, se llaman funciones amigas y se declaran de la siguiente forma class matriz; class vector { float v[4]; //.. friend vector multiplicar(const matriz&, const vector&); } class matriz { vector v[4]; //.. friend vector multiplicar(const matriz&, const vector&); } Una funcin friend puede ser puesta tanto en la parte privada como en la pblica.
Orientacin a Objetos
Pgina 28
LENGUAJES DE PROGRAMACIN
Luego la funcin friend queda como sigue, vector multiplicar(const matriz& m, const vector& v) { vector r; for(int i=0;i<3;i++) { r.v[i]=0; for(int j=0;j<3;j++) r.v[i]+=m.v[i][j]*v.v[j]; } return r; } Una funcin friend puede ser amiga de ms de dos clases. Una funcin miembro, es adems una interfaz a la clase. Una funcin miembro de una clase puede ser declarada amiga por otra, ejemplo, class x { //.. void f(); }; class y { //.. friend void x::f(); }; sto ltimo se conoce como miembros amigos.
Orientacin a Objetos
Pgina 29
LENGUAJES DE PROGRAMACIN
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 y mtodos : Imprimir, raiz_cuadrada, complejo, ao_bisiesto, fecha, hora. 5. - Escriba definiciones para las clases: complejo, vector, matriz. 6. - Escriba las declaraciones de todas las funciones miembros de las clases anteriores. Use Constructores. 7. - Escriba pequeos programas completos, donde se creen objetos de las clases anteriores y se pueda usar cada uno de los mtodos o funciones miembros de los objetos.
Orientacin a Objetos
Pgina 30
LENGUAJES DE PROGRAMACIN
3.1.1 Relacin Un - Tipo - De (A - Kind - Of Relationship) Consideremos que tenemos que escribir un programa para dibujar varios objetos tales como puntos, crculos, rectngulos, tringulos etc. Para cada objeto debemos tener una clase. Por ejemplo, si usamos un pseudo lenguaje para definir la clase punto, tenemos : class Punto { atributos: int x, y mtodos: fijarX(int nuevoX) obtenerX() fijarY(int nuevoY) obtenerY() }
Orientacin a Objetos
Pgina 31
LENGUAJES DE PROGRAMACIN
Si continuamos definiendo una clase para definir crculos tenemos, class Circulo { attributos: int x, y, radio mtodos: 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 clase Punto, estos describen la posicin del punto, en la clase Circulo, estos describen el centro del circulo. As x e y, tienen el mismo significado; en ambas clases describen, a travs de un punto, la posicin del objeto asociado. Ambas clases ofrecen el mismo conjunto de mtodos para fijar y obtener x e y. La clase Circulo agrega un nuevo elemento llamado radio y los mtodos de acceso correspondiente.
Orientacin a Objetos
Pgina 32
LENGUAJES DE PROGRAMACIN
Conociendo las propiedades de la clase Punto, se puede describir un crculo como un punto + un radio y los mtodos de 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.
A - Kind - Of
Crculo
Un - Tipo - De
Punto
La relacin A - Kind - Of es usada a nivel de clases Para 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 de Circulo, digamos circulo es un punto. Consecuentemente, cada crculo se comporta como un punto. Por ejemplo, un punto se puede mover en la direccin
Orientacin a Objetos
Pgina 33
LENGUAJES DE PROGRAMACIN
Is - A
circulo
Es - Un
punto
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 - De Algunas veces se necesita construir un objeto para combinarlo con otros. En la programacin procedural se puede usar estructuras o records. Supongamos que se han creado varias clases para diferentes figuras, entre ella Circulo y Triangulo. Si decidimos crear una figura especial para representar nuestro logo, que consiste de un crculo y un tringulo. As nuestro logo tendr dos partes, crculo y tringulo que son Parte - De nuestro logo, es decir:
Orientacin a Objetos
Pgina 34
LENGUAJES DE PROGRAMACIN
class Logo { atributos : Circulo circulo Triangulo triangulo mtodos: fijarLogo(Punto donde) }
Circulo
Parte - De
Logo
Parte - De
Triangulo
Circulo
Tiene - Un
Logo
Tiene - Un
Triangulo
3.2 Herencia Con la herencia podemos usar la relacin A - Kind - Of para clases y la relacin Is - A para objetos. Las clases que son A - Kind - Of otra clase comparte propiedades de las ltimas. Por ejemplo si se declara la clase Circulo como heredada de Punto, se tiene:
Orientacin a Objetos
Pgina 35
LENGUAJES DE PROGRAMACIN
class Circulo heredada de Punto { atributos: int radio metodos: fijarRadio(int nuevoRadio) obtenerRadio() } La clase Circulo hereda todos los atributos y mtodos de la clase Punto, por lo tanto no necesita definir los atributos y mtodos Punto. A nivel de objetos, un circulo, podra usar un punto, porque un circulo es un punto. Por ejemplo se puede definir un objeto circulo y fijar su centro se la siguiente forma : Circulo acirculo acirculo.fijarX(1) // heredada de Punto acirculo.fijarY(2) acirculo.fijarRadio(3) // agregada a Circulo La relacin Es un implica que podemos usar un circulo en cualquier parte donde exista un punto. Por ejemplo si escribimos una funcin llamada mueve, que permite mover un punto en la direccin x mueve(Punto apunto, int delta_x) { apunto.fijaX(apunto.obtenerX()+delta_x) }
Orientacin a Objetos
Pgina 36
LENGUAJES DE PROGRAMACIN
Un circulo heredado de punto puede usar un crculo como argumento, 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 hereda las propiedades de la clase B. Se dice A es heredada de B. Los objetos de la clase A tiene acceso a los atributos y mtodos de la clase B sin necesidad de redefinirlos.
Los objetos de una subclase comparten el mismo comportamiento que los objetos de la superclase. Las superclases tambin son conocidas como clases padres o clases base y las subclases como clases hijas o clases derivadas.
Orientacin a Objetos
Pgina 37
LENGUAJES DE PROGRAMACIN
heredada de
Circulo
3.3 Herencia Mltiple Una clase puede ser subclase de mas de una superclase. Una subclase por lo tanto puede mesclar las propiedades heredadas de las superclases. Supongamos que existe una clase String que permite manipilacin de texto. Por ejemplo con un mtodo que permite agregar otro texto. Si en nuestro programa que dibuja objetos queremos agregar texto. Sera interesante que adems podamos podamos mover el texto en el dibujo. Para resolver el problema crearemos una clase String_Dibujable que herede las propiedades de Punto y String.
Orientacin a Objetos Pgina 38
LENGUAJES DE PROGRAMACIN
Punto
String
String_Dibujable
En el pseudo lenguaje usaremos coma (,) para separar las mltiples 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 si fueran objetos Punto o String. As
Orientacin a Objetos
Pgina 39
LENGUAJES DE PROGRAMACIN
String_Dibujable dstring ... move(dstring, 10) ... Esto es posible porque dstring es un punto ( donde punto es un objeto de Punto)
Por otro lado si en la clase String existe el mtodo agregar para 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 puede producir conflictos de nombre si al menos dos de las superclases definen propiedades con el mismo nombre.
1. El orden en el cual las superclases son provistas. 2. La subclase puede resolver el conflicto especificando la superclase.
Orientacin a Objetos
Pgina 40
LENGUAJES DE PROGRAMACIN
Otra forma es usando otra superclase para las clases que heredan.
Las mltiples herencias son un mecanismo poderoso, sin embargo puede producir conflictos de nombres.
3.3.1 Clases Abstractas Con herencia forzamos a una subclase a tener las mismas propiedades que la superclase. Consecuentemente, los objetos de una subclase tienen el mismo comportamiento que los objetos de la superclase.
Orientacin a Objetos
Pgina 41
LENGUAJES DE PROGRAMACIN
En el programa de dibujo, cada objeto deber proveer un mtodo para dibujar su rea. Sin embargo, dibujar un crculo es diferente a dibujar un rectngulo. Supongamos el mtodo print(). que fuerce a todos los objetos dibujables a tener tal mtodo. Para esto definamos la clase Objeto_Dibujable de la cual todos los objetos dibujables heredan sus propiedades :
abstracta class Objeto_Dibujable { atributos: mtodos: print() } Se introduce la palabra clave abstracta, para especificar que las heredadas deben re definir el mtodo print(). As, desde el punto de vista de una clase abstarcta las propiedades estas especificadas, pero no definidas.
Orientacin a Objetos
Pgina 42
LENGUAJES DE PROGRAMACIN
Ejemplo class Punto heredada de Objeto_Dibujable { atributos: int x,y mtodos : fijarX(int nuevoX) obtenerX() fijarY(int nuevoY) obtenerY() print() //re definida para Punto } Definicin. Una clase A es llamada abstracta si slo es usada como superclase para otras clases. La clase A slo especifica propiedades. Esta no es usada para crear objetos. Las clases derivadas deben definir las propiedades de A.
3.3.2 Ejercicios 1.- Herencia. Considere los siguientes programas de dibujo. a) Defina la clase Rectngulo por herencia de Punto. El punto debe indicar la esquina superior izquierda del rectngulo. Cuales son sus atributos. ?. Que mtodos adicionales debe agregar ?.
Orientacin a Objetos
Pgina 43
LENGUAJES DE PROGRAMACIN
b) Todos los ejemplos anteriores estan basados en dos dimensiones. Si ahora introduce objetos en tres dimensiones como esferas y cubos. Disee una clase Esfera que use la Clase Punto3D. Especifique el rol del punto en una esfera. Que relacin existe entre la clase Punto y Punto3D ? c) Que funcionalidad le da mover() a los objetos 3D ?. Puede usarse. d) Dibuje un grafo de herencia que incluya las clases Objeto_Dibujable, Punto, Crculo, Rectngulo, Punto3D y Esfera. e) Fijece en el grfo de la clase Esfera. . Puede la siguiente ser una definicin ?
Punto
Circulo
Esfera
Orientacin a Objetos
Pgina 44
LENGUAJES DE PROGRAMACIN
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 el de clase. Cuales son las diferencias ?. Que conflictos de nombres ocurren ?
Orientacin a Objetos
Pgina 45
LENGUAJES DE PROGRAMACIN
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,
Orientacin a Objetos
Pgina 46
LENGUAJES DE PROGRAMACIN
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 : Pblica Privada 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), es privado en la subclase.
Orientacin a Objetos
Pgina 47
LENGUAJES DE PROGRAMACIN
4.2 Construccin Note que la inicializacin de una instancia de Punto3D se hace usando un constructor, el cual llama los mtodos pblicos 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 por comas. Supongamos que la clase Logo esta formada slo por un objeto de la clase Circulo y otro de la clase Rectangulo, entonces, quedara
Orientacin a Objetos
Pgina 48
LENGUAJES DE PROGRAMACIN
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 superclases tambin son invocados.
Orientacin a Objetos
Pgina 49
LENGUAJES DE PROGRAMACIN
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 } }
Orientacin a Objetos
Pgina 50
LENGUAJES DE PROGRAMACIN
De nuevo print() es un mtodo virtual, porque hereda esta propiedad de ObjetoDibujable. Si se crea una funcin cualquiera, encargada de dibujar un ObjetoDibujable cualesquiera, puede ser definida como : void desplegar(const ObjetoDibujable &obj) { // instrucciones necesarias previas obj.print(); } Cuando se usa mtodos virtuales, algunos compiladores reclaman, si el destructor de la correspondiente clase no es declarado 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 objeto actual referenciado ( y as, recursivamente a todos los destructores de las superclases). Ejemplo
Orientacin a Objetos
Pgina 51
LENGUAJES DE PROGRAMACIN
class Color { public: virtual ~Color(); }; class Rojo: public Color { public: ~Rojo(); //virtualmente heredada } class RojoFuerte: public Rojo { public: ~RojoFuerte(); }; Si se define paleta como, Color *paleta[3]; paleta[0]=new Rojo; //dinmicamente paleta[1]=new RojoFuerte; paleta[2]=new Color;
de Color
El operador new crea un nuevo objeto del tipo especificado en memoria dinmica y retorna un puntero de ste. As, new Rojo retorna un puntero a un objeto de la clase Rojo y lo asigna al primer elemento del arreglo paleta. Los elementos de paleta son punteros a Color y porque Rojo es-un Color la asignacin es vlida. El operador contrario es delete, que explcitamente destruye un objeto referenciado por un puntero, de esta forma se puede usar
Orientacin a Objetos Pgina 52
LENGUAJES DE PROGRAMACIN
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 los destructores son virtuales. Si los destructores no hubiesen sido declarados como virtuales 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 diseados para que necesariamente deban ser definidos en las subclases. Llamaremos signature o firma al tipo que retorna, nombre y parmetros que usa, pero no a la definicin. Ejemplo, class ObjetoDibujable { public: ... virtual void print()=0;
Orientacin a Objetos Pgina 53
LENGUAJES DE PROGRAMACIN
}; Con =0 estamos obligando a el mtodo print() sea definido en la subclase. Tambin a este tipo de mtodos se les denomina mtodos puros. La clases abstractas contienen slo mtodos puros.
Orientacin a Objetos
Pgina 54
LENGUAJES DE PROGRAMACIN
5 Sobrecarga de Operadores Para tipos definidos por el usuario, es posible re-definir los operadores establecidos para los tipos concretos, es decir +, -, * , / , etc. Por ejemplo supongamos la clase Complejo de la siguiente forma 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 el operador +.
Orientacin a Objetos
Pgina 55
LENGUAJES DE PROGRAMACIN
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 esta definida con dos argumentos :
Orientacin a Objetos Pgina 56
LENGUAJES DE PROGRAMACIN
Por otra parte se dice que por definicin a+b es equivalente a 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 imaginaria de 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 sus operadores como sigue,
Orientacin a Objetos
Pgina 57
LENGUAJES DE PROGRAMACIN
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) } ... ...
Orientacin a Objetos
Pgina 58
LENGUAJES DE PROGRAMACIN
Tarea
Complejo operator/(Complejo a1, Complejo a2)
Orientacin a Objetos
Pgina 59
LENGUAJES DE PROGRAMACIN
6 Tipos Genricos Los Tipos de Datos Abstractos (TDA) se usan para definir tipos creados por el usuario. A partir de los cuales nacen las clases. Por ejemplo se puede pensar en una lista de manzanas, autos o 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 un parmetro genrico el cual es especificado al momento de la creacin de la instancia.. De esta forma una instancia de un TDA genrico es una instancia de una variante particular de un TDA. Por ejemplo Lista<Manzanas> Lista_de_Manzanas Los parntesis en ngulos encierran el tipo de dato variante del TDA Lista. Lista_de_Manzanas tiene las mismas interfaces de cualquier lista pero funciona con instancias de tipo Manzanas.
Orientacin a Objetos
Pgina 60
LENGUAJES DE PROGRAMACIN
Cuando se define una clase, debemos especificar que estamos definiendo un tipo genrico. Sin embargo no se sabe que tipo de clase se usar. O sea, se debe definir una clase con un recipiente donde se indique el tipo de clase. La definicin de clase debe proveer un molde (template). La clase, de acuerdo a nuestra definicin esta definida para un tipo particular de objetos. Un ejemplo para la definicin para un tipo genrico ser: template class Lista T { atributos : ... //Datos necesarios mtodos : agregar (T elemento) T obtener_primero() T obtener_proximo() ... } La clase anterior es como cualquier clase. Sin embargo la clase lista es declarada como un molde para varios tipos de listas. El identificador T es el recipiente. Por ejemplo para una lista de manzanas.
Orientacin a Objetos
Pgina 61
LENGUAJES DE PROGRAMACIN
Lista <Manzanas> Lista_de_Manzanas Manzanas una_manzana, otra_manzana Manzanas.agregar(otra_manzana) Manzanas.agregar(una_manzana) La primera lnea declara Lista_de_Manzanas como una lista 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 <Manzana> Lista_de_Manzanas Lista <Auto> Lista_de_Autos Podemos adicionalmente declarar mas listas de manzanas, es decir, Lista <Manzana> una_Lista Lista <Manzana> otra_Lista
Orientacin a Objetos
Pgina 62
LENGUAJES DE PROGRAMACIN
Definicin.- (Clase template o molde ) Si una clase A es parametrizada con un tipo de datos B . A es llamada una clase molde o clase template. Una vez que se crea un objeto de A, B reemplaza al tipo de datos. Esto permite la definicin de una clase basada en un molde especfico 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 clases templates y son similares a las clases normales. Ejemplo template <class T> class Lista : ... { public: ... void agregar(const T dato); ... };
Orientacin a Objetos
Pgina 63
LENGUAJES DE PROGRAMACIN
De acuerdo a esto debemos especificar el tipo de lista que deseamos construir, Lista<int> lista-enteros; automticamente, el compilador interpreta el mtodo agregar como, void agregar(const int dato);
Tambin pueden ser definidas funciones template, por ejemplo, template <class T> void swap (T &a, T &b) { T tmp=a; a=b; b=tmp; }; y un posible programa sera
Orientacin a Objetos
Pgina 64
LENGUAJES DE PROGRAMACIN
int main() { int a=3; b=16; double p1=3.14; e=2.17; Persona yo (Luis Alvarez) tu (Juan Peres) swap(a,b); cout << a = << a << b = << b; swap(p1,e); cout << pi = << pi << e = << e; swap(yo,tu); cout << yo = << yo << tu = << tu; return(0); } template <class T> void swap (T &a, T &b) { T tmp=a; a=b; b=tmp; } El template puede tener mas de un argumento,
Orientacin a Objetos Pgina 65
LENGUAJES DE PROGRAMACIN
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 clases parametrizadas, ejemplo. template <class T, int tamao> class Stack { T _almacen[tamao]; public : ... }; Stack<int,128> mi_stack;
Orientacin a Objetos
Pgina 66
LENGUAJES DE PROGRAMACIN
Propiedades de listas simplemente enlazadas. 1. Elemento actual. Un iterador visita el elemento en uso. 2. Funcin sucesor. El iterador regresar el prximo elemento a ser visitado. 3. Condicin de trmino. El iterador debe proveer una condicin de trmino, no necesita chequear que todos los elementos 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 la cabeza y cola.
Orientacin a Objetos
Pgina 67
LENGUAJES DE PROGRAMACIN
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 a la 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 esta-vaca : retorna el dato del nodo cola, : retorna verdadero o falso.
Orientacin a Objetos
Pgina 68
LENGUAJES DE PROGRAMACIN
Implantacin.El block bsico de una lista es el nodo. As la primera clase a declarar ser Nodo. Lo nico que contiene un nodo is un puntero al prximo vecino (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
Orientacin a Objetos Pgina 69
LENGUAJES DE PROGRAMACIN
objeto invocado. Consecuentemente, slo se permite usar este mecanismo en declaracin o definicin respectivamente. El modificador const tambin es usado para chequear sobrecarga. De esta forma, class Xxx { ... int xx() const; int xx() ; }; declara dos mtodos diferentes. El primero es usado en contextos constantes, mientras que el segundo en contextos variables. La clase Nodo implementa un nodo simple donde : Constructores. Permiten la definicin de objetos inicializados a partir de otros ya existentes. operator =. Cada objetos debe saber como asignar otros objetos (del mismo tipo) a si mismo. operador ==. Cada objeto deber saber como compararse con otro objetos. operador != . Se aplica usando en operador == y el puntero this.
Orientacin a Objetos
Pgina 70
LENGUAJES DE PROGRAMACIN
De esta forma podemos usar Node a,b; ... if (a!=b)... note que se usa el mismo operator == de la clase. Todos los nodos deben contener datos. Los datos pueden ser de 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());} ... ...
Orientacin a Objetos
Pgina 71