Programación Orientada a Objetos Clase # 6 Reutilización del código Jueves, 2 de Mayo de 2002 Iván Bernal, Ph.D. Escuela Politécnica Nacional email: imbernal@mailfie.epn.edu.ec Agenda Prueba de medio bimestre. Reutilización de la interfaz de una clase. Paso de argumentos en funciones: por valor o por referencia. Copyright @2002, I. Bernal Iván Bernal, Ph.D. 2 Reutilización de la interfaz (1) Crear una clase y luego tener que crear una nueva repitiendo muchas cosas cuando se requiere algo similar, pero con algunas diferencias, NO es una buena idea. Es mejor tomar una clase, clonarla y hacer modificaciones o adicionar cosas al clon. Herencia (inheritance). Reutilización de la interfaz (2) Con herencia, si la clase original se cambia, la clase modificada (clon)) también refleja los cambios. La clase original se conoce con los nombres: Clase base (base Superclase (super Clase padre o madre (parent El clon se conoce como: Clase derivada (derived Clase heredada (inherited Clase hija (child Iván Bernal, Ph.D. 3 Iván Bernal, Ph.D. 4 1
Reutilización de la interfaz (3) La flecha del diagrama UML apunta desde la clase derivada hacia la clase base. Reutilización de la interfaz (4) Con el concepto de herencia, se considera la similitud entre tipos: Dos tipos podrían tener características y funcionalidad comunes. Un tipo podría tener más características que el otro. Un tipo podría manejar un mayor número de funciones, o al menos implementarla de manera diferente. Un tipo base tiene las características y funcionalidad que serán compartidas por todos los tipos que se deriven de él. Iván Bernal, Ph.D. 5 Iván Bernal, Ph.D. 6 Reutilización de la interfaz (5) Se puede definir un tipo base para representar las ideas principales de un grupo de objetos. Del tipo base se pueden derivar otros tipos para representar particularidades de ciertos objetos. Reutilización de la interfaz (6) Un ejemplo típico tomado de un sistema CAD (computer-aided design): Se tiene un tipo base shape (forma geométrica). Cada shape tiene tamaño, color, posición Cada shape puede ser: Dibujada (drawn). Borrada (erased). Movida (moved). Pintada (colored). Iván Bernal, Ph.D. 7 Iván Bernal, Ph.D. 8 2
Reutilización de la interfaz (7) Usando shape como tipo base se pueden derivar tipos específicos: Círculo (circle). Cuadrado (square). Triángulo (triangle). Otros Los tipos específicos pueden tener nuevas características (variables miembro) y nuevas funcionalidad (funciones miembro), o algunas funciones serán implementadas de forma diferente. Todos pueden tener una función para calcular el área, pero los detalles de cada uno serán diferentes. Reutilización de la interfaz (8) Iván Bernal, Ph.D. 9 Iván Bernal, Ph.D. 10 Reutilización de la interfaz (9) Cuando se hereda de un tipo existente, se crea un nuevo tipo: Se tiene a disposición todos los miembros del tipo existente (excepto los private). Se duplica el interfaz de la clase base. Todos los mensajes que se pueden enviar a objetos de la clase base, se pueden enviar a objetos del nuevo tipo, clase derivada. El tipo de la clase derivada es el mismo que el de la clase base. Un círculo es una forma geométrica. Existe una equivalencia de tipos gracias a herencia Reutilización de la interfaz (10) En cuanto a la implementación: Si solo se hereda de un clase base y no se hace nada más, se tiene a disposición la implementación de las funciones del interfaz de la clase base. Los objetos de la clase derivada tienen el mismo tipo y el mismo o comportamiento. Esto no es tan interesante, los cambios y adiciones que se permiten es lo interesante. Iván Bernal, Ph.D. 11 Iván Bernal, Ph.D. 12 3
Reutilización de la interfaz (11) Añadir nuevas funciones a la clase derivada, que no son parte del interfaz de la clase base. Se añaden funciones cuando la clase base no provee lo que se requiere. Al diseñar clases, se debe considerar la posibilidad de que la clase base sea la que necesita que mas funciones se añadan a su interfaz: Puede ser un proceso iterativo. Iván Bernal, Ph.D. 13 Reutilización de la interfaz (12) Cambiar la implementación (comportamiento) de una función que pertenece al interfaz de la clase base. Esto se conoce como: Sobrescribir, redefinir o sobrecargar una función (overriding ). Se incluye en la interfaz de la clase derivada la función, se tendrá una nueva implementación. Iván Bernal, Ph.D. 14 Paso de argumentos por valor y referencia (1) Paso de argumentos por valor y referencia (2) Un proceso en UNIX tiene dividida el espacio de memoria en tres segmentos: Segmento de texto: el código del programa. No es que están las instrucciones como las escribimos en C. Segmento de datos: espacio para las variables. Segmento del stack. Iván Bernal, Ph.D. 15 Iván Bernal, Ph.D. 16 4
Paso de argumentos por valor y referencia (3) El segmento de datos crece hacia arriba y el stackcrece crece hacia abajo. Entre los dos anteriores existe un espacio (gap). El segmento del stackcrece crece automáticamente en este espacio, de acuerdo a las necesidades. El segmento de datos no crece a menos que se use una llamada explicita al Sistema Operativo. Iván Bernal, Ph.D. 17 5