Documente Academic
Documente Profesional
Documente Cultură
TEMA 2
FUNDAMENTOS DE LA PROGRAMACIN
ORIENTADA A OBJETOS
Cristina Cachero, Pedro J. Ponce de Len
(3 sesiones)
Versin 0.5
ABSTRACCIN
OCULTACIN DE INFORMACIN.
ENCAPSULACIN
Concepto de P.O.O: objetos, clases y herencia
Carctersticas bsicas de un L.O.O
Objetos (instancias)
Clases
Paso de mensajes
Herencia
Polimorfismo
Genericidad
Gestin de errores
Aserciones
Tipado esttico
Recogida de basura
Concurrencia
Persistencia
Reflexin
2
Indice
Clases
Objetos
Atributos
Operaciones
UML y el diagrama de clases
Constructores y destructores
Propiedades constantes y de clase en C++
Relaciones entre objetos
Diseo O.O.
3
Clase
Definicin
Clase
Partes de la Definicin
Nombre
atributos
nombre1
...
operaciones
5
Clase vs TAD
Definicin:
Un TAD representa una vista del mundo centrada en datos (su estructura,
representacin y manipulacin), mientras que POO representa una vista del mundo
orientada al servicio (qu pueden ofrecer esos TADs al resto del programa).
La POO innova en aspectos como comparticin de cdigo y reuso. Estas innovaciones
se basan en tres conceptos:
Paso de Mensajes: la actividad se inicia por una peticin a un objeto especfico. En este
hecho est implcita la idea de que la interpretacin de un mensaje puede variar con distintos
objetos, y consecuentemente los nombres de operaciones no necesitan ser nicos -> cdigo
ms legible.
Herencia: permite a TADs diferentes compartir el mismo cdigo, lo que conlleva una
reduccin de su tamao y un incremento de funcionalidad.
Polimorfismo: permite que este cdigo compartido se adapte a circunstancias especficas de
tipos de datos individuales.
6
Indice
Clases
Objetos
Atributos
Operaciones
UML y el diagrama de clases
Constructores y destructores
Propiedades constantes y de clase en C++
Relaciones entre objetos
Diseo O.O.
7
Objeto
Definicin
3o:Naipe
num=3
palo=OROS
Objeto
Estado y Comportamiento
Objeto
Creacin e Inicializacin
Objeto
Creacin e Inicializacin
Cuando lo que pretendemos crear es un array de objetos
hay que guardar memoria para dos conceptos
El array en s mismo
Cada uno de los objetos que componen el array
C++ en algunos casos permite hacer ambas cosas en una sola lnea
Naipe arrayCartas[52];
Java no:
Naipe arrayCartas[]=new Naipe[13];
for (int i=0;i<13;i++)
arrayCartas[i]=new Naipe(i+1;Palo::ESPADAS);
12
Objeto
Memoria
Esttica
Dinmica
Stack
Heap
13
Objeto
Liberacin de memoria
14
Indice
Clases
Objetos
Atributos
Operaciones
UML y el diagrama de clases
Constructores y destructores
Propiedades constantes y de clase en C++
Relaciones entre objetos
Diseo O.O.
15
Atributos
Definicin
+ Pblica
# Protegida (herencia)
- Privada (encapsulacin)
~ De paquete (en Java)
16
Atributos
Definicin
type
TPlayingCard=class (TObject)
public
...
property palo: Palo read valorPalo write valorPalo;
property numero: int read valorNum;
private
valorPalo: Palo;
valorNum: Integer;
end;
17
Atributos
Tipos de Atributo
Constantes/Variables
De instancia/De clase
18
Atributos
Atributos de clase
Se tiene que almacenar espacio para ellas en algn lugar (memoria esttica)
Un atributo esttico puede ser accedido desde cualquier objeto de la clase,
ya que es miembro de la propia clase.
19
Atributos
Atributos de clase
Solucin
C#: un campo de datos esttico puede ser inicializado por un constructor declarado
como esttico y sin argumentos.
C++: inicializacin global separada de la clase y con operador de mbito
#include <iostream>
int contador::count=0;
int main(){...}
/*Ojo! Intentar inicializarlo dentro de la decl. de la clase sin
declararlo como constantes nos da el siguiente error:
Indice
Clases
Objetos
Atributos
Operaciones
UML y el diagrama de clases
Constructores y destructores
Propiedades constantes y de clase en C++
Relaciones entre objetos
Interfaces
Diseo O.O.
21
Operaciones
Definicin
Operador de
Resolucin de
mbito
Si una clase es abstracta, no puede ser instanciada, aunque s se pueden definir punteros a
ella
En C++ una clase abstracta se caracteriza porque posee al menos una funcin virtual pura
(virtual valor_retorno selector(params)=0)
22
Operaciones
Tipos de Operaciones
Tipos de operaciones:
De instancia/De clase
Constantes/Variables
Operaciones de instancia: operaciones que pueden realizar los objetos de la clase. Pueden
acceder a atributos tanto de instancia como de clase
Operaciones de clase: operaciones que acceden EXCLUSIVAMENTE a atributos de clase a
menos que se pase explcitamente el puntero this. Permiten acceder a los atributos desde la
propia clase (sin necesidad de conocer ninguna instancia, mediante el ORA)
Operaciones no constantes: no pueden ser invocadas por objetos constantes
Operaciones Constantes: Pueden ser invocadas por objetos constantes o no constantes
23
Indice
Clases
Objetos
Atributos
Operaciones
UML y el diagrama de clases
Constructores y destructores
Propiedades constantes y de clase en C++
Relaciones entre objetos
Diseo O.O.
24
+ getPalo ():Palo
+ getNum():int
class Naipe{
public:
enum Palo{OROS,COPAS,ESPADAS,BASTOS};
Palo getPalo(){return (palo);}
int getNum(){return (num);}
private:
Palo palo;
int num;
};
25
Java:
Class Naipe{
public int getPalo() {return palo;}
Naipe
public int getNum() {return num;}
- num: int
private int palo;
- palo: Palo <<enum>>
private int num;
public
public
public
public
+ getPalo ():Palo
+ getNum():int
static
static
static
static
final
final
final
final
int
int
int
int
OROS =1;
COPAS =2;
ESPADAS =3;
BASTOS =4;
26
Naipe
- num: int
- palo: Palo <<enum>>
C#:
Class Naipe{
enum Palo{OROS,COPAS,ESPADAS,BASTOS};
public Palo getPalo(){return (palo);}
public int getNum(){return (nmero);}
+ getPalo ():Palo
+ getNum():int
27
Ejercicios
Visibilidad y Encapsulacin
Asignatura
- string alumnos[500]
+ string profesor
+ void matricular(string);
+ int nAlum
+ int getAlumnos();
+ string alumnos[500]
+ void setProf(string)
28
Ejercicios
Visibilidad y Encapsulacin
Asignatura
Asignatura
- string profesor
+ string profesor
- int nAlum
+ int nAlum
- string alumnos[500]
+ string alumnos[500]
int main(){
Asignatura a;
a.matricular(Juan);
If (a.getAlumnos()>200)
a.setProf(Ana);
int main(){
Asignatura a;
a.alumnos[a.nalum++]=Juan;
If a.nAlum>200
a.profesor=Ana;
...
}
29
Indice
Clases
Objetos
Atributos
Operaciones
UML y el diagrama de clases
Constructores y destructores
Propiedades constantes y de clase en C++
Relaciones entre objetos
Diseo O.O.
30
En C++, C# y Java puede haber ms de una funcin definida con el mismo nombre
(selector) siempre que el nmero/tipo de argumentos y/o el tipo de retorno sean
suficientes para distinguir qu funcin pretende ser invocada cada vez.
31
33
34
Cubo::Cubo(float ancho_inicial,
: ancho(2), fondo(2), altura(2) float fondo_inicial, float
altura_inicial)
{ cout << "Constructor sin
: ancho(ancho_inicial),
parametros..." << endl; }
fondo(fondo_inicial),
altura(altura_inicial)
{cout << "Constructor
sobrecargado " << endl;}
Es posible definir el constructor Cubo::Cubo (float ai=10, float fi, float ai=10)?
35
Ejercicios: TCoche
Enunciado
36
Ejercicios: TCoche
Solucin: TCoche.h
TCoche
-
marca: string
color: string
n_serie: string
cuenta_km: int
l_gaso: float
consumo_med: float
+
+
+
+
+
+
TCoche()
~TCoche()
reponerGaso(float l): void
desplazar (int d, int v): bool
pintar (string c): void
mostrarDatos (void): void
class TCoche{
public:
TCoche(string,string,string,int,
float,float);
~TCoche();
void reponerGaso(float);
bool desplazar(int,int);
void pintar(string);
void mostrarDatos();
private:
string marca,color,n_serie;
int cuenta_km;
float l_gaso,consumo_med;
};
Ejercicios: TCoche
Constructor
Ejercicios: TCoche
int
main(){
Coche mio("Volvo","gris","A-000000",1600,24.0,6.0);
int i,j,reponer;
j=30;
Operador de
for (i=1;i<10;i++){
envo de
mensajes a
j=j*i;
objeto
reponer=mio.desplazar(j,120);
if (reponer==TRUE)
mio.reponerGaso(30.0);
if (i==5)
mio.pintar("blanco");
}
mio.mostrarDatos();
}
39
Ejercicios: TCoche
int
main(){
Coche *mio=new Coche("Volvo","gris","A-000000",
1600,24.0,6.0);
int i,j,reponer;j=30;
Operador de envo
for (i=1;i<10;i++){
de mensajes a ref.
j=j*i;
objeto
reponer=mio->desplazar(j,120);
if (reponer==TRUE)
mio->reponerGaso(30.0);
if (i==5)
mio->pintar("blanco");
}
mio->mostrarDatos();
delete (mio); mio=NULL;
}
40
Por defecto se realiza una copia bit a bit del objeto origen.
v1:Vector
longi=4
Vector v2=v1;
elementos
1 2 3 4
elementos
v2:Vector
longi=4
43
v1:Vector
longi=4
por qu?
elementos
1 2 3 4
Vector v2=v1;
v2:Vector
longi=4
elementos
1 2 3 4
44
Constructor
Mtodo
Propsito
Agrupar sentencias
del lenguaje
Modificadores
Slo de mbito
(+,-,#).
Cualquiera (virtual,
static, )
Tipo de retorno
Ninguno: NI
SIQUIERA VOID
45
Constructor
Mtodo
Nombre
Cualquiera
Generacin por
defecto
S (sin argumentos)
No
Invocacin por
defecto para los
datos miembro
(atributos)
N/A
46
Ejercicios: Alumno
Enunciado
};
47
Destructor
C++
TCoche::~TCoche(){
// los string autoinvocan
// a su destructor
cuenta_km=0;
l_gaso=0.0;
consumo_med=0;}
al salir de mbito
int Suma() {TVector a; ...}
Llamndolo explicitamente
a.~TVector();
50
Indice
Clases
Objetos
Atributos
Operaciones
UML y el diagrama de clases
Constructores y destructores
Propiedades constantes y de clase en C++
Relaciones entre objetos
Diseo O.O.
51
public:
Image (const int w, const int h);
private:
const int width; const int height;
//...
};
//Definicin
52
Ejercicios
Uso de const
53
Ejercicios
Uso de const
class ConDMConstantes{
private:
const int x=0; // 6?
const int y; //7?
public:
ConDMConstantes(const int x=0, const int y=0)
{this->x=x; this->y=y;};//8?
ConDMConstantes (const int x, const int y):x(x),y(y){};//9?
int getx(){return x;};//10a: Hay algn conflicto?
int getx() const {return x;}; //10b: Se puede eliminar un getx? Cul?
void setx(const int v) {x=v;}; //11
void setx (const int v) const {x=v;}; //12
}
int main(){
ConDMConstantes c;
const ConDMConstantes c2;
cout<<c.getx()<<endl;//13a: A quin llama?
cout<<c2.getx()<<endl;//13b: A quin llama?
c.setx(4);
}
54
Ejercicios
Variable global
Atributo normal
Atributo de clase (esttico) pblico
Atributo de clase privado
Empleado
-NIF:String
-nombre:String
-dir:String
+
+
+
+
+
+
+
setNIF(String):Bool
getNIF():String
setNombre(String):Bool
getNombre():String
setDir(String):Bool
getDir():String
calcularLNif(String):Char
55
Ejercicios
Empleado
-NIF:String
-nombre:String
-dir:String
+
+
+
+
+
+
+
setNIF(String):Bool
getNIF():String
setNombre(String):Bool
getNombre():String
setDir(String):Bool
getDir():String
calcularLNif(String):Char
56
57
setNIF(String):Bool
getNIF():String
setNombre(String):Bool
getNombre():String
setDir(String):Bool
getDir():String
calcularLNif(String):Char
//Empleado.h
class Empleado{
public:
bool setNIF( string n);
string getNIF();
bool setNombre( string n);
string getNombre();
bool setDir( string n);
string getDir();
char calcularLNif (String num);
static int numEmpleados;
private:
string NIF;
string nombre;
string dir;
};
58
int Empleado::numEmpleados = 0;
int main(){
Empleado jefe(AAA","123");
Empleado *aliasJefe=&jefe;
cout << Cuenta: " << Empleado::numEmpleados << endl;
cout << "Cuenta: " << jefe.numEmpleados << endl;
cout << "Cuenta: " << aliasJefe->numEmpleados << endl;
Empleado programador(BBB","123");
Empleado *aliasProg=&programador;
cout << "Cuenta: " << Empleado::numEmpleados<< endl;
cout << "Cuenta: " << programador.numEmpleados << endl;
cout << "Cuenta: " << aliasProg->numEmpleados << endl;
return (0);
}
60
62
int Empleado::numEmpleados = 0;
int
main()
{
Empleado jefe(AAA","123");
cout<<Cuenta: "<<Empleado::getNumEmpleados() << endl;
cout << "Count: " << jefe.getNumEmpleados() << endl;
Empleado programador(BBB","123");
Empleado *ept = &programador;
cout << "Count: " << Empleado::getNumEmpleados() << endl;
cout << "Count: " << programador.getNumEmpleados() << endl;
cout << "Count: " << ept->getNumEmpleados() << endl;
};
63
Indice
Clases
Objetos
Atributos
Operaciones
UML y el diagrama de clases
Constructores y destructores
Propiedades constantes y de clase en C++
Relaciones entre objetos
Diseo O.O.
64
65
Asociacin
Todo-Parte
Entre clases
No persist.
C1
C2
Uso (depend)
C1
C2
Agregacin
Composicin
Generalizacin
(Tema 3)
vehiculo areo
avion
helicoptero
66
Unaria
Binaria
marido
casado-con
Administra
0.. 1
mujer
0.. 1
Persona *
jefe nombre
0.. 1 s. s.
trabaja-para
emplea-a
* Compaa
nombre
direccin
empleado
67
Por defecto 1
Formato: (mnima..mxima)
Ejemplos (notacin UML)
1
0..1
M..N
*
0..*
1..*
1,5,9
Implementacin en C++
Un solo puntero o un array de punteros del tamao
indicado por la cardinalidad mxima.
69
Asociacin: Ejemplo
A partir del dibujo de la Fig., define la clase Pieza (.h)
Una pieza se relaciona con 0..1 casillas
Una casilla se relaciona con 0..1 piezas
Rol
Pieza
...
+ Pieza()
+ Pieza (Pieza &p)
+ ~Pieza()
...
Casilla
- pieza
0..1
est_en
- casilla
-ocupada: Bool
...
0..1 + Casilla()
Multiplicidad
70
class Pieza{
public:
Pieza(){casilla=NULL;}; // Constructor por defecto.
~Pieza(){casilla=NULL;}; //Destructor
Pieza(const Pieza &p){
casilla=p.casilla;
}
Casilla& getCasilla(){return (*casilla);};
void setCasilla(Casilla
&mcasilla){casilla=&mcasilla;};
private:
Casilla* casilla;
...
};
71
Asociacin: Ejemplo
A partir del dibujo de la Fig., define la clase Barco (.h)
Un barco se relaciona con 1..4 casillas
Una casilla se relaciona con 0..1 barcos
Rol
Barco
Casilla
- numCasillas:Int
est_en
- bco
+ Barco()
+ Barco (const Barco &b)
+ ~Barco()
...
0..1
- cas
-ocupada: Bool
...
1..4 + Casilla()
Multiplicidad
72
class Barco{
private:
Detectis alguna posible
inconsistencia que no controle este
static const int MAX_CAS=4;
cdigo? Modifica lo que sea
Casilla *cas[MAX_CAS];
necesario.
int numCasillas;
public:
Barco(){
Cambiara en algo el cdigo de la
clase Casilla definido en el ejercicio
numCasillas=0;
for (int x=0;x<MAX_CAS;x++) anterior (aparte del nombre del
puntero)?
cas[x]=NULL;
}
Barco(const Barco& b){
for (int x=0;x<MAX_CAS;x++)
cas[x]=b.cas[x];
numCasillas=b.numCasillas;
}
~Barco(){
for (int x=0;x<MAX_CAS;x++)
cas[x]=NULL;
}
};
73
Trabajador
-nif:String
-nombre:String
-dir:String
...
+ Trabajador()
+ Trabajador (Trabajador &t)
+ ~Trabajador()
...
Proyecto
*
trabaja_en
pTrabaja
tTrabajan
tDirige
1..*
dirige
pDirige
-nombre:String
-presupuesto: Int
...
+ Proyecto()
+ Proyecto (const Proyecto &p)
+ ~Proyecto()
0..2
74
75
76
Agregacin
Asociacin binaria que representa una relacin todo-parte
(tiene-un, es-parte-de, pertenece-a)
Composicin
Agregacin fuerte:
Una instancia parte est relacionada, como mximo,
con una instancia todo en un instante dado
Cuando un objeto todo es eliminado, tambin son
eliminados sus objetos parte (Es responsabilidad del
objeto todo disponer de sus objetos parte)
77
1. Puede el objeto parte comunicarse directamente con objetos externos al objeto agregado?
No => inclusiva (+ Composicin)
S => no inclusiva (+ Agregacin)
78
6. Cuntos objetos de una clase componente puede tener asociados un objeto agregado?
7. Puede el objeto agregado no tener objetos de una clase componente en algn instante?
79
Objeto Todo
A..C
B..D
Objeto Parte
Objeto Todo
?..1
?
Objeto Parte
81
82
83
Relaciones todo-parte
Implementacin (C++)
84
Relaciones todo-parte
-b
B
class A {
private:
B b;
// b es un
// subobjeto
};
A
10
-b
A
0..10
-b
class A {
class A {
private:
private:
B b[10];
B *b[10];
};
int num_b;
// o B *b[10];
};
// si B tiene
// clases derivadas
A
0..*
-b
B
class A {
private:
B **b;
int num_b;
};
85
Relaciones todo-parte
A
0..10
-b
B
A::~A() {
class A {
private:
B *b[10];
int num_b;
};
numb=0;
}
86
Relaciones todo-parte
Ejemplo Bicicleta
0..1
AGREGACIN
0..2
Rueda
Bicicleta
1..1
COMPOSICIN
0..2
Rueda
87
Relaciones todo-parte
Ejemplo Bicicleta
Bicicleta
0..1
AGREGACIN
class Rueda{
private:
string nombre;
public:
Rueda(string n){nombre=n;};
};
class Bicicleta{
private: Rueda *r[2]; //puntero
0..2
public:
Rueda
Bicicleta(){r[0]=NULL; r[1]=NULL;}
Bicicleta(Rueda *r1, Rueda *r2){
r[0]=r1;
r[1]=r2;
int main(){
};
Rueda *r, *r2, *r3;
Rueda *r= new Rueda("primera"); void cambiarRueda(int pos, Rueda *raux){
r[pos]=raux;
Rueda *r2= new Rueda("segunda");
Rueda *r3=new Rueda(tercera); };
~Bicicleta(){
Bicicleta b1(r1,r2);
r[0]=NULL;
b1.cambiarRueda(0,r3);
r[1]=NULL;
b1.~Bicicleta();
}
//Qu pasara con las ruedas?
};
}
88
Relaciones todo-parte
Ejemplo Bicicleta
class BicicletaComp{
private:
Podra ser un
subobjeto?
BicicletaComp
1..1
r[1]=new Rueda(s);}
~BicicletaComp(){
delete r[0]; r[0]=NULL;
COMPOSICIN
0..2
Rueda
delete r[1];r[1]=NULL;}
};
int main(){
BicicletaComp b2(tercera",cuarta");
BicicletaComp b3(tercera,cuarta);
//son ruedas distintas aunque con el mismo nombre
}
89
Relaciones todo-parte
Ejemplo Jardn
Jardn
0..N
Planta como
especie
AGREGACIN
0..N
Planta
1..1
COMPOSICIN
0..N
Planta como
planta fsica y sin
sentido fuera de
un jardn
Planta
90
Relaciones todo-parte
Ejemplo Jardn
class Jardin {
public:
Jardin(string);
~Jardin();
Jardin(const Jardin &);
void Plantar(string, string,
string);
void Arrancar(string, string);
private:
Planta *p[100];
int numplantas;
string emplazamiento;
};
Jardin::Jardin(string lugar){
emplazamiento=lugar;
numplantas=0;
for(int i=0;i<100;i++)
p[i]=NULL;
}
Jardin::~Jardin(){
for(int i=0;i<numplantas;i++)
{
delete(p[i]);
p[i]=NULL;
}
numplantas=0;
}
91
Relaciones todo-parte
Ejemplo Jardn
92
Relaciones todo-parte
Ejemplo Jardn
Relaciones todo-parte
Ejemplo Jardn
94
Relaciones todo-parte
Ejercicio
0..N
AGREGACIN
0..*
Planta
96
<<friend>>
<<instantiate>>
<<call>>
B
B
B
97
Gasolinera
Supongamos que no nos interesa guardar las gasolineras en las que ha repostado un
coche: no es asociacin.
float
TCoche::respostar(Gasolinera& g, float litros){
float importe=g.dispensarGaso(litros,tipoC);
if (importe>0.0) //si xito dispensar
lGaso=lGaso+litros;
return (importe);
}
98
Indice
Clases
Objetos
Atributos
Operaciones
UML y el diagrama de clases
Constructores y destructores
Propiedades constantes y de clase en C++
Relaciones entre objetos
Diseo O.O.
102
El diseo de aplicaciones OO
103
El diseo de aplicaciones OO
Interfaz e Implementacin
Principios de Parnas
105
El diseo de aplicaciones OO
Mtricas de calidad
106
Bibliografa
T. Budd.
Captulo 2
G. Booch.
Cap. 3 y 4
114