Publicado el 31 de Mayo del 2018
1.387 visualizaciones desde el 31 de Mayo del 2018
718,8 KB
65 paginas
Creado hace 18a (09/10/2006)
Programación Orientada a Objetos
TEMA 2
Clases y Objetos
Facultad de Informática
Universidad de Murcia
Índice
Introducción
1.
2. Clases
3. Objetos
4. Semántica referencia vs. Semántica almacenamiento
5. Métodos y mensajes
6. Ejemplo: representación de una lista enlazada
7. Creación de objetos
8. Modelo de ejecución OO
9. Semántica de las operaciones sobre referencias:
asignación, igualdad y copia
10. Genericidad
Clases y Objetos
2
•1
1.- Introducción
Programa OO
Clase
Objeto
Colección estructurada
de clases
Implementación de un TAD
Una instancia de una clase
Los objetos se comunican mediante mensajes
Clases y Objetos
3
2.- Clases
• DEFINICIÓN: Implementación total o parcial de un TAD
• Entidad sintáctica que describen objetos que van a tener la
misma estructura y el mismo comportamiento.
• Doble naturaleza: Módulo + Tipo de Datos
– Módulo (concepto sintáctico)
• Mecanismo para organizar el software
• Encapsula componentes software
– Tipo (concepto semántico)
• Mecanismo de definición de nuevos tipos de datos: describe una
estructura de datos (objetos) para representar valores de un
dominio y las operaciones aplicables.
Clases y Objetos
4
•2
Ejemplo Modula2: Módulo ≠ Tipo
DEFINITION MODULE Pila;
EXPORT QUALIFIED PILA, vacia, pop, push, tope;
TYPE PILA;
PROCEDURE vacia(pila:PILA): BOOLEAN;
PROCEDURE nuevaPila: PILA;
PROCEDURE pop (VAR pila:PILA):INTEGER;
PROCEDURE push (VAR pila:PILA; valor:INTEGER);
PROCEDURE tope (VAR pila:PILA):INTEGER;
END Pila;
Clases y Objetos
5
Especificación separada de la implementación
PROCEDURE pop (VAR pila:PILA):INTEGER;
VAR rslt:INTEGER; tmp:PILA;
BEGIN
rslt:=0;
IF (pila <>NIL)
BEGIN
rslt:=pila^.valor;
tmp:=pila;
pila:=pila^.siguiente;
delete(tmp);
IMPLEMENTATION MODULE Pila;
TYPE PILA = POINTER TO Node;
Node = RECORD
valor:INTEGER;
siguiente:PILA;
END;
END;
RETURN rslt;
END pop;
...
END Pila;
Clases y Objetos
6
•3
Componentes de un clase
• Atributos
– Determinan una estructura de almacenamiento para cada
objeto de la clase
• Rutinas (Métodos)
– Operaciones aplicables a los objetos
– Único modo de acceder a los atributos
Ejemplo: Al modelar un banco, encontramos objetos “cuenta”.
Todos los objetos “cuenta” tienen propiedades comunes:
• atributos: saldo, titular, ...
• operaciones: reintegro, ingreso, …
Definimos una clase CUENTA.
Clases y Objetos
7
Ejemplo: Clase Cuenta
Cuenta
titular: String;
saldo: float;
reintegro(valor:float);
ingresar (valor:float);
Tiempo de ejecución
Definición de la clase
Atributos
Métodos
“José Martínez”
1200.0
titular
saldo
Objeto Cuenta
Clases y Objetos
8
•4
Relaciones entre clases
• Clientela
Persona titular;
class Cuenta{
Una clase A es cliente de una clase B, si A contiene una
declaración en la que se establezca que cierta entidad
…
class CuentaAhorro extends Cuenta{
(atributo, parámetro, variable local) e es de tipo B (e:B)
}
…
}
• Herencia
Una clase es una versión especializada de otra existente
Ejemplo:
Cuenta
titular
Persona
CuentaAhorro
CuentaCorriente
Cuenta es cliente de Persona
CuentaAhorro es una especialización de Cuenta
Clases y Objetos
9
titular : PERSONA;
saldo : INTEGER;
codigo: INTEGER;
abrir (quien: PERSONA) is do
end;
reintegro (suma: INTEGER) is do
end;
saldo:=0;
titular:=quien;
codigo:= codigos.nuevo_valor;
!!ultOper
ingreso (suma: INTEGER) is do
saldo:=saldo+suma
end;
ver_ult_oper (n: INTEGER) is do … end;
….
class CUENTA
creation abrir
feature {ALL}
end
e
s
a
l
c
e
d
n
ó
i
c
i
n
i
f
e
d
o
l
p
m
e
j
E
l
e
f
f
i
E
n
e
feature {NONE}
ultOper: LIST[INTEGER];
puedo_sacar (suma: INTEGER): Boolean is do
end;
Result:= saldo>=suma
if puedo_sacar(suma) then saldo:=saldo-suma;
-- rutina para sacar dinero
-- caracteristicas públicas
-- rutina de creación
-- codigos función ONCE
-- rutina para ingresar dinero
-- visualiza las n ultimas oper.
-- at y rutinas privadas
Clases y Objetos
10
•5
Clases en Eiffel
• Abstracción de tipos
– Atributos: saldo:INTEGER
• exportados en modo consulta (Principio de Acceso Uniforme)
• Sólo modificables por los métodos de la clase aunque sean
públicos
– Rutinas:
• procedimientos: ingreso(suma:INTEGER)is do ...end
• funciones:
puedo_sacar(suma:INTEGER):BOOLEAN is do ...end
– Variables de clase:
• Eiffel no tiene variables globales
• Funciones once = El objeto se crea sólo una vez pero puede
cambiar su valor
Clases y Objetos
11
Función once
codigos: Contador is
!!Result
once --devuelve siempre el mismo objeto Contador
end
--crea un objeto contador
• El objeto contador que devuelve se puede modificar utilizando
los métodos de la clase contador. Por ejemplo:
codigos.nuevo_valor
Siendo nuevo_valor un método de la clase Contador que
incrementa el valor del contador (de tipo INTEGER) y
devuelve ese nuevo valor.
Clases y Objetos
12
•6
Clases en Eiffel
• Ocultación de información
Especificación de acceso a un grupo de características:
– públicas: (por defecto)
– privadas:
– exportadas de forma selectiva.
feature {ALL}
feature {NONE}/feature{}
feature {A,B, ...}
• Modularidad
– El único módulo son las clases
– Cluster = Agrupación de clases relacionadas pero no es
parte del lenguaje sino que depende del entorno de
desarrollo
– Para hacer uso de un cluster se debe decir al entorno Eiffel
Clases y Objetos
13
Eiffel y Ocultación de Información
class ICE1 feature
at1: INTEGER;
...
end
class TEC1 feature
//Público
atrib1: ICE1;
atrib2: INTEGER;
una_rutina (p: INTEGER) is do
atrib2:= p;
atrib2:= atrib1.at1;
at1:= p;
atrib1.at1:= p;
end;
end
Exportación de atributos
-- clase Eiffel
en modo consulta
(=función)
-- No error
-- Error en compilación
-- Error en compilación
atrib1.setAt1(p);
Modificación:
Clases y Objetos
14
•7
e
d
n
ó
i
c
i
n
i
f
e
d
e
d
o
l
p
m
e
j
E
)
z
a
f
r
e
t
n
i
(
+
+
C
n
e
e
s
a
l
c
e
d
n
ó
i
c
i
n
i
f
e
d
e
d
o
l
p
m
e
j
E
)
n
ó
i
c
a
t
n
e
m
e
l
p
m
i
(
+
+
C
e
s
a
l
c
// Cuenta.h, definición del TAD Cuenta
class Cuenta {
public:
Cuenta (Persona *quien) {saldo=0;
titular=quien;
codigo = nuevoCodigo();
ultOper = new lista<int>;}
reintegro(int suma);
void
ingreso(int suma);
void
verSaldo();
int
void
verUltOper(int n);
static int nuevoCodigo();
//devuelve el ultimoCodigo y lo incrementa
private:
Persona * titular;
int
int
static int ultimoCodigo; //variable de clase
lista<int> * ultOper;
saldo;
codigo;
bool
puedoSacar(int suma) {return (saldo >=suma);}
};
Clases y Objetos
15
// cuenta.cpp, Definición de las funciones de la clase
#include “cuenta.h”
// inicializa la variable de clase
int Cuenta :: ultimoCodigo = 0;
void
}
void
}
int
}
void
}
Cuenta :: reintegro (int suma) {
if puedoSacar(suma) saldo=saldo-suma;
Cuenta :: ingreso (int suma) {
saldo=saldo+suma;
Cuenta :: verSaldo () {
return saldo;
Cuenta :: verUltOper(int n) {
...
static int Cuenta :: nuevoCodigo() {
return (ultimoCodigo++);
}
Clases y Objetos
16
•8
Clases en C++
• Abstracción de tipos
– atributos.
• No pueden ser exportados en modo consulta
• Tipos primitivos y punteros
– todas las rutinas tienen un valor de retorno.
– Atributos y métodos de clase (static)
• Ocultación de información
– Especificación de acceso para un grupo de miembros:
•public: un cliente puede consultarlo y ¡¡modificarlo!!
•private: sólo accesible dentro de la clase
– Clases amigas: Se le concede acceso TOTAL a la clase amiga
17
Clases y Objetos
Clase “amiga”
class NodoArbol {
friend class Arbol;
private:
class B {
friend class A;
private:
int i;
public: ...
}
En la clase A,
B *ob
ob -> i = 89
int dato;
NodoArbol decha;
NodoArbol izda;
…
};
class Arbol{
private:
NodoArbol *raiz;
...
… raiz ->dato=50; ...
La amistad no es hereditaria ni transitiva
};
Clases y Objetos
18
•9
Clases en C++
• Modularidad
– Definición de nuevos tipos: clases (class) y estructuras
(struct)
– Una estructura equivale a una clase con todos los miembros
públicos por defecto (se puede usar private)
– namespace: mecanismo para agrupar datos, funciones, etc.
relacionadas dentro de un espacio de nombres separado
namespace Parser {
double term(bool obten){/*multiplica y divide */}
double expr(bool obte) {/*suma y resta */}
…
}
Para usar una función: Parser::expr(…);
Clases y Objetos
19
Ficheros para la especificación de la clase
Cuenta
Cuenta.h
Interfaz de la clase
cuenta
Banco.cpp
Cuenta.cpp
#include “Cuenta.h”
utiliza Cuenta
#include “Cuenta.h”
implementa Cuenta
• #include para importar ficheros cabecera
• toda la información se use o no
• pueden ocurrir dependencias circulares que debe solucionar
el programador en lugar del compilador
Clases y Objetos
20
•10
Ejercicio
Intenta escribir en C++ la siguiente clase Eiffel,
class CELOSO
feature {NONE}
esposa: MUJER;
feature {MECANICO}
coche: AUTOMOVIL
…
end
Clases y Objetos
21
e
d
n
ó
i
c
i
n
i
f
e
d
e
d
o
l
p
m
e
j
E
a
v
a
J
n
e
e
s
a
l
c
// Cuenta.java, declaración de la clase Cuenta ( .class por cada clase al compilar)
package gestiondecuentas;
import java.util.*;
public class Cuenta {
private Persona titular;
saldo;
private int
private int
codigo;
private static int ultimoCodigo; //variable de clase
private int [] ultOper;
public Cuenta (Persona quien) {saldo=0;
titular=quien;
codigo = nuevoCodigo();
ultOper = new int[20];}
public void
{ ... }
Comentarios de: TEMA 2 Clases y Objetos - Programación Orientada a Objetos (0)
No hay comentarios