¡Descarga Programación orientada a objetos y más Apuntes en PDF de Ingeniería Infórmatica solo en Docsity!
Programación orientada a objetos (^1) M. Martínez, URJC, 2004
PROGRAMACIÓN
ORIENTADA A OBJETOS
Programación orientada a objetos (^2) M. Martínez, URJC, 2004
1.- Introducción
Ventajas de la POO
- Trabajo en equipo
- Empaquetar los datos con sus operaciones
- Separar la interfaz de la implementación.
- Mantenimiento y reutilización
- Problemas:
- Mucho código para los casos particulares.
- Entremezclado con los casos generales.
- La extensión implica modificación de lo existente.
- Soluciones:
- Herencia: distinguir lo que es general de lo que es particular.
- Polimorfismo: Detectar automáticamente a qué categoria particular pertenece un objeto.
Principios de la POO
• ENCAPSULACIÓN
- Se agrupan los datos y las operaciones que actúan sobre ellos.
- Se oculta al exterior los detalles de los datos y las operaciones.
- HERENCIA
- Los objetos pertenecen a una clase.
- Para definir lo que es general se define una clase (clase base).
- Para definir lo que es particular, se definen clases derivadas (subclases) que heredan las características generales de la clase base y añaden las características particulares.
Programación orientada a objetos (^5) M. Martínez, URJC, 2004
• POLIMORFISMO
- Una variable puede contener objetos de distintas clases.
- Una operación con la misma interfaz puede corresponder a operaciones distintas, según la clase del objeto. a Hereda: a, b Añade: c Hereda: a Añade: b Programación orientada a objetos (^6) M. Martínez, URJC, 2004
2.- Definición de clases y
objetos. Encapsulación.
¿Qué es una clase?
- CLASE = Tipo compuesto definido por el programador. - Contiene información ( datos o variables de instancia ) - Contiene funciones y procedimientos para usar esa información. ( operaciones o métodos ). - Se llaman en general miembros de la clase.
- Un objeto es una variable de ese tipo ( instancia de la clase ).
Definición de una clase en
Delphi (Object Pascal)
- La sintaxis es muy parecida a la de definición de un tipo registro, pero: - Se utiliza la palabra CLASS en lugar de RECORD. - Los elementos pueden ser subprogramas, representados por su cabecera. TYPE nombre_clase = CLASS <dato_i>: Tipo_dato; .... <subprograma_j>; ..... END;
Programación orientada a objetos (^13) M. Martínez, URJC, 2004
Clases y unidades
- Es habitual, y una buena práctica de programación, que una clase y sus operaciones se definan en una unidad separada. - La declaración de la clase se pone en la parte de interfaz. - La implementación de las operaciones se pone en la parte de implementación.
- A veces se meten varias clases en una unidad. Programación orientada a objetos (^14) M. Martínez, URJC, 2004
Ejemplo
UNIT Aeroplan; INTERFACE TYPE TAeroplano = CLASS Velocidad: integer; Altitud: integer; PROCEDURE Inicializa(vel_ini, alt_ini: integer); PROCEDURE Acelera; PROCEDURE Frena; PROCEDURE Asciende; PROCEDURE Desciende; FUNCTION AnguloDeAscension: real; END; {declaración de TAeroplano} IMPLEMENTATION PROCEDURE TAeroplano.Inicializa; BEGIN Velocidad := vel_ini; Altitud := alt_ini; END; ... END.
Crear objetos
- Se define una variable que tiene como tipo la clase del objeto. VAR A: TAeroplano;
- Modelo de referencia de objetos: La variable no contiene el objeto en sí, sino una referencia al objeto.
- NO es necesario usar la flecha (A^.Velocidad)
- Pero hay que tenerlo en cuenta en algunas circunstancias: - Los objetos deben crearse y destruirse explícitamente. - La asignación supone una copia de punteros. - El objeto no se crea por el hecho de declarar la variable, hay que crearlo (“ instanciar” el objeto) mediante una sentencia: variable := nombre_clase.Create; Ejemplo: A := TAeroplano.Create; - Al terminar de utilizar el objeto, hay que destruirlo, con una sentencia: variable.Free; Ejemplo: A.Free; - No se debe usar un objeto antes de crearlo, ni después de destruirlo.
Programación orientada a objetos (^17) M. Martínez, URJC, 2004
Usar objetos
- Para acceder a los datos, se escribe el nombre del objeto, un punto y el nombre del dato. writeln(‘La velocidad es’, A.Velocidad);
- Para invocar los métodos, se escribe el nombre del objeto, un punto y la llamada : A.Inicializa(80, 0); A.Acelera; A.Frena; P := A.AnguloDeAscension; R := Y * A.AnguloDeAscension; Programación orientada a objetos (^18) M. Martínez, URJC, 2004
- Se puede aplicar la sentencia WITH a un objeto: WITH A DO BEGIN Inicializa(80, 0); Acelera; Asciende; END;
- Se puede asignar un objeto a otro de la misma clase. VAR A, B: TAeroplano; ... B := A; Sustituye un objeto por el otro ( no es una copia dato a dato). No destruye el objeto que contenía anteriormente B.
Ocultación de información
- En una declaración de clase, se pueden definir cuatro tipos de secciones, según el grado de visibilidad al exterior: nombre_clase = CLASS PUBLIC <datos y métodos publicos> PUBLISHED <datos y métodos publicados> PRIVATE <datos y métodos privados> PROTECTED <datos y métodos protegidos> END; - PUBLIC indica que los datos y métodos son accesibles. La sección pública forma la interfaz de la clase. - PUBLISHED indica que son públicos, y además accesibles para el editor gráfico de Delphi (Se usa sólo en objetos gráficos) Es el acceso por defecto. - PRIVATE indica que los datos y métodos de esa sección sólo son accesibles para los métodos de la propia clase.
Programación orientada a objetos (^25) M. Martínez, URJC, 2004
Ejemplo 1: TPunto
TYPE TPunto = CLASS PUBLIC PROCEDURE Inicializa; PROCEDURE CambiaX(n_x: real); PROCEDURE CambiaY(n_y: real); FUNCTION ObtenX: real; FUNCTION ObtenY: real; FUNCTION MismaAbscisa(P: TPunto): boolean; PRIVATE x, y: real; END; {TPunto} ... FUNCTION TPunto.MismaAbscisa(P: TPunto): boolean; BEGIN IF Self.x = P.x THEN MismaAbscisa := True ELSE MismaAbscisa := False; END; Programación orientada a objetos (^26) M. Martínez, URJC, 2004
Ejemplo 2: Unidad Complejos
(I)
UNIT Complejos; INTERFACE TYPE TComplejo = CLASS PRIVATE preal, pimag: real; PUBLIC PROCEDURE Inic(n_real, n_imag: real); PROCEDURE Suma(op1, op2: TComplejo); PROCEDURE Resta(op1, op2: TComplejo); PROCEDURE Escribe; END; IMPLEMENTATION PROCEDURE TComplejo.Inic(n_real, n_imag: real); BEGIN preal := n_real; pimag := n_imag; END;
Ejemplo 2: Unidad Complejos
(y II)
PROCEDURE TComplejo.Suma (op1, op2: TComplejo); BEGIN preal := op1.preal + op2.preal; pimag := op1.pimag + op2.pimag; END; PROCEDURE TComplejo.Resta (op1, op2: TComplejo); BEGIN preal := op1.preal - op2.preal; pimag := op1.pimag - op2.pimag; END; PROCEDURE TComplejo.Escribe; BEGIN writeln('preal= ',preal, 'pimag = ',pimag); END; END.
Ejemplo 2: Programa Principal
PROGRAM PComplejo; USES Complejos; VAR c1, c2, c3: TComplejo; i: integer; BEGIN c1 := TComplejo.Create; c1.Inic(0.0,0.0); c2 := TComplejo.Create; c2.Inic(1.0, 2.0); c3 := TComplejo.Create; c3.Inic(2.0, 3.0); c1.Suma(c2, c3); c1.Escribe; c1.Free; c2.Free; c3.Free; END.