Lenguaje C Segunda parte Intro a UML sobrecarga
Lenguaje C++ Segunda parte Intro. a UML, sobrecarga, polimorfismo, herencia y Templates Ana Lila Laureano-Cruces Elena Cruz Miguel
Modelado Visual Es modelado usando una notación gráfica estándarizada n Captura las partes esenciales de un sistema n Abstrae la complejidad n El análisis de casos de uso es una técnica para capturar el proceso del negocio desde la perspectiva del usuario n
UML Lenguaje Unificado de Modelado n Estandar para el modelado de aplicaciones Orientados a Objetos n Es una sintaxis, no una metodología n Proporciona una gran gama de diagramas y la semántica asociada a esta. n
Booch, Rambaugh y Jacobson adoptaron los siguentes objetivos: n Representar sistemas completos, en lugar de solamente la parte de software, usando conceptos orientados a objetos. n Establecer una relación explícita entre conceptos y código ejecutable. n Crear un lenguaje de modelado que pudiera ser usado por humanos y máquinas. n
Ventajas UML es el lenguaje estándar para visualizar, especificar, construir y documentar los productos de un sistema de software n UML se puede usar con todos los procesos, a lo largo del ciclo de vida de desarrollo y a través de diferentes tecnologías de implementación n
Diseño Diagramas Asociados: n - Diagrama de Objetos Fundamental en el diseño y n - Diagrama de Clases Documentación de un sistema n - Diagrama de Estados n - Diagrama de Actividades n - Diagrama de Secuencia n - Diagrama de Componentes n
Conceptos sobre Clases Describe un grupo de objetos con n propiedades similares, con relaciones comunes y con semántica común (mismos atributos y patrones de comportamiento) n La clase de un objeto es una propiedad implícita de sí mismo n Al agrupar los objetos en clases se abstrae el problema, lo que da al modelo su potencia y capacidad de generalizar n
Diagramas de Clase • Atributos: es una propiedad del elemento, que es compartida por todos los objetos, y describe una característica. n • Operaciones: es la implementación de un servicio que muestra el comportamiento de la clase. n
n Un diagrama de clases se compone de un rectangulo dividido en tres secciones Nombre. De. Clase Sección de atributos Sección de operaciones
Usuario visibilidad - son privados + son públicos -nombre -edad -fecha. Nacimiento +agregar. Usuario +borrar. Usuario +modificar. Usuario Nombre de la clase Atributos o características Comportamiento u operaciones
Sintaxis compacta Autentifica. Usuario Asociación Navegabilidad Indica cómo esta relacionada una clase con otra Indica el sentido valido de recorrido
Sobrecarga
Sobrecarga n La sobrecarga permite definir varias funciones que: Tienen el mismo nombre n El número de parámetros que reciben es distinto n Los tipos de datos de retorno son iguales n Los tipos de datos de los parámetros pueden ser distintos n
Sobrecarga int compara(int v 1, int v 2) n { n n if(v 1>v 2) n return(1); n else if(v 1<v 2) n return(-1); n else n return(0); n }
Sobrecarga int compara(char *v 1, char *v 2) n { n n for(int i=0; i<strlen(v 1); i++) n if(v 1[i]==v 2[i]) n continue; n else if(v 1[i]<v 2[i]) n return(-1); n else n n n } return(0); return (if(strlen(v 1)==strlen(v 2)? 0: -1;
Sobrecarga con funciones n Si se utilizan parámetros con valores default, la función puede representarse con un conjunto de funciones: void funcion( int a = 50, float f = 23. 45, char c = 'q' ); n El conjunto de funciones equivalentes es: void funcion ( ); void funcion( int ); void funcion ( int, float, char );
Sobrecarga de Operadores La sobrecarga del operador se asocia con la semantica n Se mantiene la presedencia y asociatividad en los operadores n Se pueden definir formas de prefijos y postfijos del mismo operador n
Sobrecarga con Operadores que pueden ser sobrecargados n Relacionales >, <, <=, >=, !=, == n Aritméticos +, -, *, /, %, ^ n A nivel de bits &, |, ~, !, <<, >>, n Asignación =, +=, -=, *=, /=, %=, ^=, &=, |=, <<=, >>= n Otros , &&, ||, ++, --, ->, [ ], ( ), new, delete
Ejemplo n Sobrecarga del operador + entre numeros imaginarios. Imaginario Imginario: : operator + (Imaginario i) { Imaginario mi = *this; return Imaginario( im. p_real + i. p_real, im. p_imaginaria + i. p_imaginaria ); }
Polimorfismo
Polimorfismo Muchas formas n A un mismo mensaje distinto comportamiento n
Overriding o Redefinición de Funciones n Overriding es redefinir una función en una clase derivada: § § § mismo nombre de la función. mismo tipo y número de argumentos. mismo tipo de retorno en una clase derivada.
Ejemplo class User { public: . . . virtual int get. Permissions() const; . . . } class Employee : public User { . . . } int Employee: : get. Permissions() const { cout << “ Permisos Empleadon” } igual tipo de retorno igual número y tipo de argumentos
Sobrecarga y sobreescritura n n La sobrecarga se refiere a crear funciones del mismo nombre, pero con diferente tipo y número de argumentos y valor de retorno dentro de una misma clase derivada o subclase. n Las funciones resultantes son independientes entre sí. La redefinición redefine una función en la clase derivada con mismo tipo y número de argumentos, y valor de retorno. n Las funciones resultantes se sobreescriben entre sí.
Polimorfismo n El polimorfismo es una de las características centrales de la programación orientada a objetos, junto con el encapsulamiento y la herencia. n Significa que un objeto responderá a una función de acuerdo a la definición propia que tiene para ese método.
Polimorfismo en C++ n El polimorfismo en C++ trabaja sobre métodos heredados y/o redefinidos ( overriden ).
Ejemplo class User {. . . virtual int get. Permissions() const; } class Employee : public User { . . . } int Employee: : get. Permissions() const { cout << “ Permisos Empleadon” }
Ejemplo User user 1, *user 2; Employee employee 1; user 2 = &employee; user 1. get. Permissions(); // User. employee 1. get. Permissions(); // Employee.
Ejemplo - ( 3 de 3 ) int main(void ) { Usuario *persons[]={new Usuario(2), new Empleado(15), new Administrador(500)}; show. Permissions( persons ); } void show. Permissions( Usuario *usuarios[] ) { for( int i = 0; i < 3; i++ ) usuarios[i]->get. Permisos(); cout << endl;
Clases Abstractas Una clase abstracta es aquella que define funciones virtuales puras. n Las funciones virtuales puras se definen como: n virtual void print() const = 0;
Herencia en C++
Herencia n Propiedad que permite crear nuevas clases a partir de las clases existentes n Conserva las propiedades de la clase original y añade nuevas características n Usado para la resolución de problemas complejos
Recomendaciones n Buscar categorías, propiedades comunes y distintas que nos permitan clasificar los objetos.
Clase Base y Clase Derivada n Se le llama Clase Base a la clase de la cuál van a heredar las demás. n Se llama clase derivada a las clases creadas a partir de una clase base.
Clase Derivada n Una clase derivada hereda todos los miembros de la clase base y puede acceder a los miembros públicos (public) y protegidos (protected) de la clase o clases base, como si fueran miembros de ella misma. Una clase derivada no tiene acceso a los miembros privados (private) de la clase base.
Ejemplo n Persona n Propiedades comunes n Nombre n Fecha de nacimiento n Genero n Estado civil
n Empleado n Características adicionales n Sueldo n Número empleado n Area
n Alumno n Características adicionales n Matricula n Licenciatura
Jerarquía de Clases Persona Empleado Administrativo Estudiante Académico
Modelado UML Clase. Base Sección de atributos Sección de funciones Clase. Derivada Sección de atributos Sección de funciones
Modelado UML Diagrama de clases Persona - nombre - edad - fecha. Nacimiento Sección de funciones Empleado - id. Empleado - sueldo - area Sección de funciones
Sintaxis n Para la declaración de clases derivadas, encontramos después del nombre de la clase derivada, dos puntos (: ) , y luego alguna de las siguientes palabras clave: n public n private n protected
n class base { //Cuerpo de la clase base }; class derivada : [public/private/. . ] base { //Cuerpo de la clase derivada };
Constructores de Clases Derivadas n Cuando una clase base tiene un constructor y una clase derivada también, al crear el objeto, se llama primero al constructor de la clase base, y cuando la ejecución de éste termina, se llama al constructor de la clase derivada. Gracias a que el constructor de la clase base es llamado, es posible inicializar la clase base, desde el constructor de la clase derivada. Esto se logra pasando una lista de los constructores de las clases base, con sus respectivos parámetros.
Ejemplo PERSO. H #ifndef PERSO_H #define PERSO_H #include<iostream. h> #include<string. h> #include<stdlib. h> class persona{ public: persona: : persona(char *n, int e){ nombre=new char[strlen(n)+1]; edad=e; } const char *Leer. Nombre(char *n) const; int Leer. Edad() const{ return edad; } protected: char *nombre; int edad; };
class empleado: public persona{ public: empleado: : empleado(char *n, int e, float s): persona(n, e){ salarioanual=s; } float leersalario() const; protected: float salarioanual; }; class alumno: public persona{ public: alumno: : alumno(char *n, int e, double m): persona(n, e){ matricula=m; } double leermatricula() const; protected: double matricula; }; #endif
Principal. cpp #include<iostream. h> #include"perso. h" #include<conio. h> void main() { int edad; system("cls"); alumno edoo("mario", 24, 20021); edad=edoo. Leer. Edad(); cout<<edad; getch(); }
Templates Introducción n la programación clásica n diferenciación entre los datos y su manipulación, es decir, entre los datos y el conjunto de algoritmos para manejarlos. n Los datos eran tipos muy simples n generalmente los algoritmos estaban agrupados en funciones orientadas de forma muy específica a los datos que debían manejar.
Introducción n La POO introdujo nuevas facilidades: n Extender el concepto de dato, n permitiendo tipos más complejos a los que se podía asociar la operaciones necesarias. n Además n La posibilidad de ocultación de determinados detalles internos irrelevantes para el usuario n y la capacidad de herencia
Programación genérica n Se dieron cuenta que frecuentemente las manipulaciones contienen un denominador común que se repite bajo apariencias diversas n criterios de ordenación n validaciones
n Los algoritmos deben ser parametrizados al máximo. n Expresados de la forma más independiente posible de detalles concretos n permitiendo la posibilidad de servir para una mayor variedad posible de tipos y estructuras de datos.
n Algoritmo genérico que permita representar algoritmos con ciertas características comunes n Definición de los tipos: a que tipos pueden aplicarse este algoritmo n Y sus reglas de uso, independiente.
n Las plantillas, que se introdujeron con la versión del Estándar de Julio de 1998
n La idea central a resaltar aquí es que una plantilla genera la definición de una clase o de una función mediante uno o varios parámetros. A esta instancia concreta de la clase o función se la denomina una especialización o especialidad de la plantilla.
n n C++ utiliza una palabra clave específica template para declarar y definir funciones y clases genéricas. En estos casos actúa como un especificador de tipo y va unido al par de ángulos < > que delimitan los argumentos de la plantilla: template <T> void fun(T& ref); // declaración de función genérica n template <T> class C {/*. . . */}; // declaración de clase genérica n
n n n n #include class Objeto. Generico { public: virtual void Dibuja() {}; }; class Circulo : public Objeto. Generico { int x, y, r; public: Circulo(int xi=100, int yi=100, int ri=100) { x=xi ; y=yi; r=ri; } void Dibuja() { circle(x, y, r); } };
class Elipse : public Objeto. Generico { int x, y, rx, ry; public: Elipse(int xi=100, int yi=100, int rxi=60, int ryi=80) { x=xi; y=yi; rx=rxi; ry=ryi; } void Dibuja() { ellipse(x, y, 0, 360, rx, ry) ; } }; class Rectangulo : public Objeto. Generico { int xizq, yarriba, ancho, alto; public: Rectangulo(int xi=10, int yi=10, int an=40, int al=60) { xizq=xi; yarriba=yi; ancho=an; alto=al; } void Dibuja() { rectangle(xizq, yarriba, xizq+ancho, yarriba+alto); } };
class Nodo { Objeto. Generico *figura; Nodo *sig; public: Nodo(Objeto. Generico *fig) { figura=fig; } Nodo * Recupera. Siguiente() { return sig; } void Poner. Siguiente(Nodo *nodosig) { sig=nodosig; } void Muestra() { figura->Dibuja(); } };
class Lista { Nodo *cabeza; public: Lista() { cabeza=new Nodo(NULL); cabeza->Poner. Siguiente(NULL); } void Insertar (Objeto. Generico *fig); void Desplegar(); }; void Lista: : Insertar(Objeto. Generico *fig) { Nodo *aux; For(aux=cabeza; aux->Recupera. Siguiente()!=NULL; aux=aux->Recupera. Siguiente()); Nodo *nuevo = new Nodo(fig); nuevo->Poner. Siguiente(NULL); aux->Poner. Siguiente(nuevo); } void Lista: : Desplegar() { Nodo *aux; for(aux=cabeza->Recupera. Siguiente(); aux!=NULL; aux=aux->Recupera. Siguiente()) aux->Muestra(); }
n n n n void main() { int graphdriver = DETECT, graphmode; initgraph(&graphdriver, &graphmode, ". . \bgi"); Lista. Fig; Circulo *c 1 = new Circulo(50, 80); Lista. Fig. Insertar(c 1); Elipse *e 1 = new Elipse; Lista. Fig. Insertar(e 1); Rectangulo *r 1 = new Rectangulo(30, 50); Lista. Fig. Insertar(r 1); Lista. Fig. Desplegar(); closegraph(); }
- Slides: 60