You are on page 1of 19

POO POO

TEMA 2 Modelado del mundo real


PROGRAMACIÓN
ORIENTADA A La Programación orientada a objetos (POO) se basa en
estructuras modulares basadas en datos (objetos) que
OBJETOS incluyen los procedimientos de acceso a esos datos
(métodos)

Conceptos básicos Los objetos en la POO deben modelar objetos del


mundo real.
Objeto, mensaje
El Diseño orientado a objetos (DOO) es un modelo de
Clase, Herencia construcción de software basado no en la función que
dicho software debe realizar sino en los objetos que se
Polimorfismo manipulan.

Ecuación fundamental de la POO


Problema Proceso real Resultado
Clasificación de LOO
Codificación Interpretación
Algunos lenguajes y ejemplos

Simula, Eifell, etc. Modelo Algoritmos Resultado comput.

Smalltalk

2. Programación Orientada a Objetos N. 1 2. Programación Orientada a Objetos N. 2

POO POO

Pasos en el Diseño Orientado a Objetos Objetos

Representan a los datos del problema real


1. Localizar los objetos
Booch: "Entidad tangible que representa un
2. Describir los objetos (su conducta) comportamiento bien definido"

Desde la perpestiva del conocimiento humano:


3. Describir las relaciones entre los objetos
Algo tangible y/o visible
4. Usar los objetos
Alguna cosa que pueda ser comprendida
¿Qué puede ser un objeto? intelectualmente

Un número Algo hacia lo que se dirige el pensamiento o la


Una cola acción

Un diccionario Representa un elemento individual e identificable, real


o abstracta, con un comportamiento bien definido en el
Un compilador dominio del problema
Una ventana
objeto = estado + comportamiento + identidad
Una urna
.....

Es decir, un objeto pertenece al dominio del problema

2. Programación Orientada a Objetos N. 3 2. Programación Orientada a Objetos N. 4


POO POO

Objeto. Estado Objeto. Comportamiento

Propiedades o atributos que caracterizan al objeto Viene determinado por la forma en la que el objeto
interactúa con el sistema.
Cada atributo debe tener un valor en algún dominio
La forma de actuar sobre un objeto es enviándole un
Los valores de los atributos pueden variar a lo largo de mensaje
la vida del objeto
El mensaje activará un comportamiento del objeto
Los atributos de un objeto son tenidos en cuenta según (método) que será el que determine su forma de actuar
el dominio del problema
Los métodos son los comportamientos del objeto
Si quiero vender un coche, los atributos que
intereresan son el precio, color, potencia, Pueden generarse métodos para
terminación,...
Permitir consultas sobre aspectos internos del
Si lo que quiero es participar en un rally, lo que objeto
interesa es aceleración, potencia, velocidad,
anchura de ruedas, Modificar atributos del objeto

Los atributos de un objeto deben ser privados al objeto Envíe mensajes a otros objetos

...

2. Programación Orientada a Objetos N. 5 2. Programación Orientada a Objetos N. 6

POO POO

Objeto. Identidad Objeto

Propiedad característica que los distingue del resto de Implementación


los objetos
Mantiene una memoria privada que describe las
Dos objetos con propiedades del objeto (su estado). Sus atributos
(variables de instancias, slot o datos miembro)
los mismos atributos
Disponen de un conjunto de operaciones que actúan
los mismos valores en sus atributos sobre dicha memoria privada. Son las que definen
su comportamiento (métodos o funciones miembro)
Son iguales pero no idénticos
Un objeto tiene una identidad. (Normalmente una
Para distinguir objetos se utilizan varias técnicas dirección)

Utilizar dirección de memoria o referencia La forma en la que un método actúa sobre un objeto es
a través del envío de mensajes. En un mensaje
Utilizar nombres definidos por el usuario intervienen:

Utilizar claves identificadoras internas o externas Receptor Es el objeto que recibe el mensaje

La identidad de un objeto permanece con él durante Selector Es el comportamiento que está


toda su vida involucrado en el mensaje

La identidad no se la proporciona el usuario.


Simplemente, la tiene

2. Programación Orientada a Objetos N. 7 2. Programación Orientada a Objetos N. 8


POO POO

Resultado del envío de un mensaje Primera visión de un Sistema Orientado


a Objetos
El resultado esperado del envío de un mensaje
dependerá: envía ms1 a obj1
Del estado en que se encuentre dicho objeto
obj1 métodos
Del método involucrado en el mensaje
De la información que este mensaje pueda portar

Un método tiene total visibilidad sobre los atributos


del objeto al cual le han enviado el mensaje.

Cuando a un objeto se le envía un mensaje, el ms1


método activado puede utilizar como variables los
atributos del objeto receptor pudiendo incluso
modificarlos

El único camino para acceder al estado de un objeto


debe ser por la activación de algún método, es decir,
por el envío de un mensaje

El conjunto de métodos que un objeto es


capaz de responder es su protocolo o
interfaz y define su conducta

2. Programación Orientada a Objetos N. 9 2. Programación Orientada a Objetos N. 10

POO POO

Ejemplo
Objeto: Una urna

Se desea realizar el siguiente experimento. Memoria privada del objeto:


De una urna que contiene inicialmente un número Número de bolas blancas
determinado de bolas blancas y otro número
determinado de bolas negras, se pretende realizar lo Número de bolas negras
siguiente:
Interfaz (métodos)

Mientras en la urna quede más de una bola,


sacaBola() Devolverá el color de la bola
Sacar dos bolas de la misma, sacada. Decrementa en uno el
Si ambas son del mismo color número de bolas de ese color
Introducir una bola negra en la urna,
Si ambas son de distinto color meteBola(Color) Incrementa en uno el
Introducir una bola blanca en la urna, número de bolas del color dado
Extraer la bola que queda y determinar su color.
quedanBolas() Devuelve cierto si hay bolas
Vamos a estudiar el objeto urna, su estado y su en la urna
comportamiento.
quedaMasDeUnaBola() Devuelve cierto si
hay más de una bola en la urna
Int totalBolas() Devuelve el número total de
bolas. (privado)
2. Programación Orientada a Objetos N. 11 2. Programación Orientada a Objetos N. 12
POO POO

Creación y destrucción de un objeto


El ejemplo resuelto en PseudoC
main()
Crear un objeto es como crear una variable de tipo, por {
tanto tienen las mismas propiedades que los datos de /*u es un objeto urna con 34 bolas
cualquier tipo. Destruirlo debe ser igual blancas y 56 negras */
Urna u(34,56);
Además hay que inicializarlo char a,b;

Todo esto es algo muy dependiente del lenguaje. Se


while (u.quedaMasdeUnaBola())
verá en cada lenguaje como hacerlo
{ // en cada pasada, el número
// de bolas disminuye en uno
Mientras no se hable de lenguajes, a=u.sacaBola();
supongamos: b=u.sacaBola();
if (a==b)
Que todo se puede escribir en "PseudoC"
u.meteBola('n');
Que el envío de un mensaje a un objeto u con else
selector m se escribe por u.m u.meteBola('b');
}
Que la manera de crear e inicializar un objeto de
algún tipo, es simplemente creando una variable printf("La bola final es de color

de ese tipo y que en la creación se le propociona %c \n",u.sacaBola());


el valor inicial de sus variables de instancias }
como argumentos.
Para crear el objeto urna u con 34 bolas bancas y
56 negras se escribirá Urna u(34,56).

2. Programación Orientada a Objetos N. 13 2. Programación Orientada a Objetos N. 14

POO POO

Clases
En el ejemplo:

La definición de urna anterior no define el Urna puede verse como la clase que describe el
comportamiento de todas las urnas
comportamiento de una urna, sino de todas las
urnas. (Se ha definido una clase) u es una instancia de esa clase.

u es sólo un ejemplo de ese comportamiento (Un objeto Los atributos que describen la memoria privada
Urna o una instancia de la clase Urna)
de un objeto se llaman
Una clase describe el comportamiento de una variables de instancia, slot, datos miembro
familia de objetos.
Los comportamientos se llaman
Es una plantilla que se utiliza para definir los objetos.
métodos, funciones miembro
Puede verse como un tipo (que además define métodos)
Dos formas de ver una clase
Los objetos que se definen a partir de esa clase son sus
variables de instancia
instancias. clase Urna métodos
Clase Urna
Son las instancias las que reciben los mensajes u
es-instancia-de 34
definidos en su clase.
56
u

2. Programación Orientada a Objetos N. 15 2. Programación Orientada a Objetos N. 16


POO POO

Instancias Descripción de una clase


Clase Urna
El número de bolas blancas y el número de Variables de Instancia privadas
bolas negras son dos variables de instancia Número de bolas blancas (blancas)

definidas en la clase. Numero de bolas negras (negras)


Métodos públicos
los valores 34 y 56 inicialmente son los valores de las sacaBola()
variables de instancia que definen el estado de la urna u. meteBola(color)
quedanBolas()
Es evidente que podemos crear varias urnas quedaMasDeUnaBola()

main() Métodos privados

{ totalBolas()

Urna u(34,67),v(89,23); Fin Clase

u.meteBola('n');
Las clases son las unidades básicas de la POO
// u tiene ahora 34 blancas y 68 negras
La implementación depende del lenguaje. Si utilizamos
v.meteBola('b');
el PseudoC, se antepondrá el nombre de la clase
// v tiene ahora 90 blancas y 23 negras seguido de :: al nombre del método en su definición
.... para indicar a la clase a la que pertenece dicho método
Ambas responden a los mismos mensajes con los char Urna::sacaBola()
mismos métodos pero su actuación depende de su {
estado que es particular ....
}

2. Programación Orientada a Objetos N. 17 2. Programación Orientada a Objetos N. 18

POO POO

Referencias al propio objeto Ventajas de la utilización de clases

Un objeto puede enviarse un mensaje a sí mismo Cada clase puede ser creada de modo independiente
int Urna::totalBolas()
{
Cada clase puede probarse de modo independiente
return (blancas+negras);
Asegura la consistencia de los datos pues ofrece un
}
interfaz para su manejo
int Urna::quedaMasDeUnaBola()
{
La implementación queda escondida al usuario de la
return (1 < mimismo.totalBolas()); clase (lo mismo que la implementación de los enteros
} queda oculta a los que los usan)
mimismo = self, current, this
Puede variarse la implementación sin tener que cambiar
los programas que las utilizan.
Hay lenguajes que la referencia a mimismo puede
suprimirse
Es altamente reutilizable
int Urna::quedaMasDeUnaBola()
{
Resumen
return (1 < totalBolas());
} Todas las instancias de una clase responden al mismo
conjunto de mensajes con los mismos métodos

Todas las instancias de una clase tienen las mismas


variables de instancias pero cada una con sus valores

2. Programación Orientada a Objetos N. 19 2. Programación Orientada a Objetos N. 20


POO POO

Programadores en la Programación Segunda visión de un Sistema


Orientada a Objetos Orientado a Objetos

1. Productores de clases

2. Consumidores de clases
Un programa puede contener instancias de clases
previamente definidas y clases definidas
específicamente para este programa.

La relación entre variables de instancia y los objetos de


una clase se define como una relación de tipo "..es parte
de.."

Así, el atributo número de bolas blancas de la urna


u es parte de la urna u

Un objeto puede contener como una parte suya a otros


objetos. Agregación

Un objeto puede contener como una parte suya


referencias a otros objetos. Asociación

Composición: Agregación o Asociación

2. Programación Orientada a Objetos N. 21 2. Programación Orientada a Objetos N. 22

POO POO

Ecuación fundamental de la POO Tipos Abstractos de datos

PROGRAMACION ORIENTADA A Permiten:


OBJETOS
Encapsulación Guardar conjuntamente datos y
= operaciones que actuan sobre
ellos
TIPOS ABSTRACTOS DE DATOS
Ocultación Proteger los datos de manera que
+ se asegura del uso de las
funciones definidas para su
HERENCIA
manejo
+
Ventajas:
POLIMORFISMO Implementación escondida al cliente
Los tipos abstractos se generan
independientemente
Los tipos abstractos se pueden probar
independientemente
Aseguran la consistencia de los datos
Aumentan la reutilización de código

2. Programación Orientada a Objetos N. 23 2. Programación Orientada a Objetos N. 24


POO POO

Las posibilidades de ocultación de la Ejercicio1:


información dependen del lenguaje en el que se
Definir el problema anterior con urnas trampas. Son
implemente. urnas que despues de 10 extracciones, tienen una
probabilidad del 0.2 de cambiar todas las bolas blancas
Hay lenguajes que ponen diferentes niveles de por negras y viceversa.
privacidad

Hay lenguajes que no pueden hacer las variables de


Ejercicio2:
instancias privadas
Dos jugadores disponen cada uno de una urna.

Una clase se implementa como un tipo Inicialmente, cada uno toma 20 bolas de los colores que
quiera (blancas o negras). Por ejemplo, uno puede meter
abstracto de datos en la suya (10,10) y el otro (2,18)

Cada jugador conoce la identidad de su oponente


Mientras quede mas de una bola
en cualquiera de las dos urnas,
El jugador A realiza su jugada
El jugador B realiza su jugada
Si en las urnas de A y de B queda una bola
empatan
Si en la urna de A queda una bola, A pierde
Si en la urna de B queda una bola, B pierde

2. Programación Orientada a Objetos N. 25 2. Programación Orientada a Objetos N. 26

POO POO

Solución ejercicio1:
La jugada de A consiste en:
Sacar una bola de su urna Clase UrnaTrampa
Sacar una bola de la urna de su contrincante Variables de Instancia privadas
Si son iguales blancas
meter una bola negra al contrincante negras
Si son distintas contExtracciones
devolver al contrincante su bola Métodos públicos
sacaBola()
La jugada de B consiste en: meteBola(color)
Sacar una bola de su urna quedanBolas()
Sacar una bola de su contrincante quedaMasDeUnaBola()
Si son iguales Métodos privados
meter una bola blanca al contrincante totalBolas()
Si son distintas Fin Clase
devolver la bola del contrincante
y el programa
Pista

Cada jugador deberá tener en propiedad una urna y


conocer al adversario

2. Programación Orientada a Objetos N. 27 2. Programación Orientada a Objetos N. 28


POO POO

main() Solución ejercicio2


{
UrnaTrampa v(23,34); Clase JugadorA
char a,b; Variables de instancia privadas
while (v.quedaMasDeUnaBola()) Urna urna
{// cada pasada, decrementa una bola JugadorB contrincante
a=v.sacaBola(); Métodos públicos
b=v.sacaBola(); contra(JugadorB)
if (a==b) jugada()
v.meteBola('n'); urna()
else Fin clase
v.meteBola('b');
}
Clase JugadorB
printf("La bola final es de color %c
Variables de instancia privadas
\n",v.sacaBola());
Urna urna
}
JugadorA contrincante

Ahora hay que implementar la clase UrnaTrampa Métodos públicos


contra(JugadorA)
Es igual que Urna salvo el método sacarBola() jugada()
urna()
Fin clase

2. Programación Orientada a Objetos N. 29 2. Programación Orientada a Objetos N. 30

POO POO

y el programa Veamos la descripcion de los métodos jugada


main(){ en cada clase
JugadorA J1(10,15); JugadorA::jugada()
JugadorB J2(13,12); {
J1.contra(J2); char m, c;
J2.contra(J1); // Un método de una clase, ve las
while (J1.urna().quedaMasDeUnaBola() variables de instancia
&& J2.urna().quedaMasDeUnaBola()) // del objeto al cual se le envía
{ el mensaje
J1.jugada(); m=urna.sacaBola();
J2.jugada(); c=contrincante.urna().sacaBola();
} if (m==c)
if (J1.urna().quedaMasDeUnaBola()) contrincante.urna().meteBola('n');
printf( "GANA J1\n"); else
else if (J2.urna().quedaMasDeUnaBola()) urna.meteBola(c);
printf( "GANA J2\n"); }
else
printf( "EMPATE\n");
}

2. Programación Orientada a Objetos N. 31 2. Programación Orientada a Objetos N. 32


POO POO

JugadorB::jugada() Herencia
{
char m, c;
m=urna.sacaBola(); Es una técnica que permite incrementar la
c=contrincante.urna().sacaBola(); reusabilidad.
if (m==c)
contrincante.urna().meteBola('b'); Maneja eficientemente relaciones "..es como un..."
else
urna.meteBola(c); Crea nuevas clases a partir de generalizar o especializar
} otras clases ya existentes.

Otro caso Para ello a la hora de crear una clase puede


JugadorA juan,pepe,antonio reutilizar parte de la conducta de otra clase.
El mensaje Esto se hace por medio de:
juan.urna().sacaBola(),
se refiere a una bola de la urna de juan añadir, suprimir o modificar métodos
antonio.urna().sacaBola(),
añadir o suprimir variables de instancias
se refiere a una bola de la urna de antonio
pepe.urna().meteBola('n'),
"es un(a)"
mete una bola negra en la urna de pepe

Si las variables de instancia fueran públicas


pepe.contrincante.urna.meteBola('n')
mete una bola negra en la urna del
contrincante de pepe

2. Programación Orientada a Objetos N. 33 2. Programación Orientada a Objetos N. 34

POO POO

La herencia clasifica a las clases en una


La clase así resultante sería una clase que es jerarquía.
heredera de la inicial. CLASEB
CLASE A meto3
Si A hereda de B, obj1 meto1
meto2
meto4
meto5
obj2 meto3 meto6
A es hija de B, A es subclase de B, A es derivada de B
A hereda de B
B es padre A, B es superclase de A, B es ancestro de A Todo objeto de A lo es
y de sus subclases obj3 también de B
obj1.meto1()
La herencia puede ser obj1.meto3()
obj1.meto4()
simple. Una clase hereda obj3.meto3()
exclusivamente de otra clase
múltiple. Una clase hereda de varias
clases

2. Programación Orientada a Objetos N. 35 2. Programación Orientada a Objetos N. 36


POO POO

Una urna heredada Referencias al padre


char Urna::sacaBola()
Sea UrnaTrampa una clase que hereda las {
propiedades de la clase Urna. if (random()*mimismo.totalBolas() < blancas)
{
La clase UrnaTrampa es como una Urna pero blancas--;

con un comportamiento especial return 'b';


}
Clase UrnaTrampa hereda Urna
else
Variables de Instancias Privadas
{
contExtracciones
negras--;
Métodos privados
return 'n';
cambiaBolas()
}
Fin Clase
}
No se indican los métodos que hereda de la clase Urna
Definimos sacaBola() en UrnaTrampa
Una vez definida, se usa como una clase más int UrnaTrampa::sacaBola()
{
Una clase puede redefinir los métodos de la clase de la if (contExtracciones==10)
que hereda. La nueva definición puede apoyarse en la {
antigua. contExtracciones = 0;
if (random()>=0.2)
Se puede redefinir el ejercicio1 basada en esta mimismo.cambiaBolas();
nueva definición de la clase UrnaTrampa }
return mipadre.sacaBola();
}

2. Programación Orientada a Objetos N. 37 2. Programación Orientada a Objetos N. 38

POO POO

Herencia frente a composición


mipadre = super, nombre de la clase::

En este caso, no hay que modificar ningún método más


en la clase UrnaTrampa Herencia: A hereda de B cuando A es como
un B ....
Si en la clase Urna se define el método
bool Urna::dosIguales()
Relación de inclusión entre clases
{
char a,b;
a = mimismo.sacaBola(); Composición: B contiene a A cuando A es
b = mimismo.sacaBola(); parte de B.
mimismo.meteBola(a);
mimismo.meteBola(b);
return (a==b);
Relación de cliente-servidor entre clases
}
Una clase usa o se basa en otra para su definición
tampoco habría que modificarlo en UrnaTrampa.

Por supuesto, habría que crear el método


Ejemplo:
UrnaTrampa::cambiaBolas()
{ Herencia: clase Punto y clase Pixel (es un punto con
int temp;
color)
temp = blancas;
Composición: clase Chasis, clase Motor, clase Ruedas,
negras = blancas;
etc. forman parte de la clase Coche
blancas = temp;
}

2. Programación Orientada a Objetos N. 39 2. Programación Orientada a Objetos N. 40


POO POO

Clase Abstracta Clase Abstracta

Clases que proporcionan un interfaz común y Esta clase abstracta definirá todos sus métodos
básico a sus herederas. excepto el método jugada() que será definido de
forma particular por cada subclase.
De ella no se obtendrá ninguna instancia Clase JugadorA hereda Jugador
Clase JugadorB hereda Jugador
Definirá métodos con el cuerpo vacío o
métodos con comportamientos generales a urna contrincante Clase Jugador
todas las subclases Clase JugadorA contra()
jugada() jugada()
urna()
Supongamos que se define una clase Jugador que define
las características generales de cualquier jugador Clase JugadorB
Clase Jugador jugada()
Variables de instancia privadas
Urna urna
Jugador contrincante
Métodos públicos
contra(Jugador)
Jugada será un método vacio en la clase Jugador
jugada()
Cada subclase JugadorA y JugadorB definen su propio
urna()
método jugada()
Fin clase

2. Programación Orientada a Objetos N. 41 2. Programación Orientada a Objetos N. 42

POO POO

Polimorfismo Polimorfismo por sobrecarga de


funciones
Capacidad de una entidad de referenciar
distintos elementos en distintos instantes. Se comentó al principio cuando se habló de
sobrecarga de funciones
Dos tipos de polimorfismo
Dos funciones con el mismo nombre y distintos
Por sobrecarga de funciones argumentos son funciones distintas

ad hoc Dos funciones con el mismo nombre y con los mismos


argumentos pero definidas en distintas clases son
a medida funciones distintas.

Por vinculación dinámica


Este tipo de polimorfismo es resuelto en
paramétrico tiempo de compilación

Permite especificar un mismo nombre a funciones que


realizan una misma actividad en distintas clases

Objetos de distintas clases, pueden recibir el mismo


mensaje. Cada clase dispone de un método para aplicar
a dicho mensaje

2. Programación Orientada a Objetos N. 43 2. Programación Orientada a Objetos N. 44


POO POO

Polimorfismo por vinculación dinámica


Polimorfismo dinámico
Vinculación estática: "Un identificador de variable que referencie a un
objeto de una clase, puede pasar a referenciar a
En tiempo de compilación se conoce el tipo de todas otro objeto de otra clase"
sus variables y expresiones.
C++ impone ciertas restricciones a esta frase:
Vinculación dinámica:
"siendo esta otra clase una subclase o derivada de
En tiempo de compilación no puede determinarse el la anterior"
tipo de algunas variables o expresiones.
Es decir, donde se espera un objeto de una clase, se
El compilador puede que no sepa a qué clase pertenece puede recibir un objeto de una clase derivada.
un objeto antes de la ejecución.
Así, por ejemplo
Por tanto hasta tanto no se determine la clase a la que JugadorA J1(20,20);
pertenece el objeto, no podrá sustituir el cuerpo. Por JugadorB J2(15,25);
tanto, esta vinculación tiene que hacerse en tiempo de Jugador N;
ejecución. if (condicion)
N=J1;
else
N=J2;
N.jugada(); // Qué jugada es?

2. Programación Orientada a Objetos N. 45 2. Programación Orientada a Objetos N. 46

POO POO

Tercera visión de un Sistema Orientado Ejemplo


a Objetos
Supongamos que queremos realizar un sistema
que trabaje con figuras geométricas planas.
El sistema debe poder mostrar información de
una figura y computar su área.
Se manejaran varios tipos de figuras, entre
ellas, círculos y rectángulos
Dos aproximaciones:
Sin utilizar las técnicas de la POO

Se utilizará un código C para la descripción del


programa

Utilizando las técnicas de la POO

Se utilizará un pseudocódigo para describir el


programa. En el capítulo dedicado a C++ se
matizaran todos los aspectos de pseudocódigo
utilizados

2. Programación Orientada a Objetos N. 47 2. Programación Orientada a Objetos N. 48


POO POO

Sin POO Sin POO


#define TCirculo 1 // Funcion que computa el area
#define TRectangulo 2 double area(Figura *p_figura)
typedef struct Circulo {
{ double varea;
short tipo; // tipo de figura // se maneja el area dependiendo del tipo
double x,y; // centro del circulo switch(p_figura->tipo)
double radio; // radio del circulo {
} Circulo case TCirculo:
typedef struct Rectangulo varea=M_PI*p_figura->cir.radio*
{ *p_figura->cir.radio;
short tipo; // tipo de figura break;
double x1,y1; // corner inicial case TRectangulo:
double x2,y2; // corner final varea=fabs(
} Rectangulo (p_figura->rec.x2-
typedef union Figura p_figura->rec.x1)*
{ (p_figura->rec.y2-
short tipo; // tipo de figura p_figura->rec.y1));
Circulo cir; // datos del circulo break;
Rectangulo rec; // datos del rectangulo default: printf("Figura desconocida\n");
} Figura return -1;
}
// prototipo de funciones return varea;
double area(Figura *p_figura); }
void muestra(Figura *p_figura);

2. Programación Orientada a Objetos N. 49 2. Programación Orientada a Objetos N. 50

POO POO

Sin POO Sin POO


// Funcion que muestra la figura int main()
void muestra(Figura *p_figura) {
{ int i;
printf("Figura: "); Figura s[2]; //array con dos figuras
switch(p_figura->tipo) // inicializa s[0] con un rectangulo
{ s[0].tipo=TRectangulo;
case TCirculo: s[0].rec.x1=80.0;
printf("Círculo de radio %f y s[0].rec.y1=30.0;
de centro (%f,%d)\n", s[0].rec.x2=300.0;
p_figura->cir.radio, s[0].rec.y2=50.0;
p_figura->cir.x, // inicializa s[1] con un circulo
p_figura->cir.y); s[1].tipo=TCirculo;
break; s[1].cir.radio=80.0;
case Trectangulo: s[1].cir.y=40.0;
printf("Rectángulo corner (&f,%f) s[1].cir.x=30.0;
y (%f,%d)\n", // Computando areas
p_figura->rec.x1, for (i=0;i<2;i++)
p_figura->rec.y1, printf("Area figura[%d]=%f\n",i,
p_figura->rec.x2, area(&s[i]));
p_figura->rec.y2); // Mostrando figuras
break; for (i=0;i<2;i++)
default: printf("Desconocida \n"); muestra(&s[i]);
} return 0;
} }

2. Programación Orientada a Objetos N. 51 2. Programación Orientada a Objetos N. 52


POO POO

Sin POO Con POO

Añadiendo una nueva figura. Queremos Creamos una clase abstracta Figura. Esta clase
incorporar triángulos. soporta los métodos muestra y area
Clase Figura
Metodos de instancia publicos
1 Añadir el tipo Triangulo muestra()
#define TTriangulo 3 area()
typedef struct Triangulo Fin clase
{ Figura::muestra()
short tipo; // tipo de figura; {
double x1,y1; // Coor. de punto 1 printf("Debe implementarla la subclases\n");
double x2,y2; // Coor. de punto 2 }
double x3,y3; // Coor. de punto 3 Figura::area()
} {
printf("Debe implementarla la subclases\n");
2 Añadirlo a la unión de figuras
return 0.0;
typedef union Figura }
{
short tipo; // tipo de figura
Circulo cir; // datos del circulo
Rectangulo rec; // datos del rectangulo
Triangulo tri; // datos del triangulo
} Figura

3 Modificar las funciones muestra y area


2. Programación Orientada a Objetos N. 53 2. Programación Orientada a Objetos N. 54

POO POO

Con POO Con POO

Creamos Circulo como subclase de Figura Creamos Rectangulo como subclase de Figura

Clase Circulo hereda Figura Clase Rectangulo hereda Figura


Variables de instancia publicas Variables de instancia publicas
radio, x, y; x1,y1,x2,y2;
Fin Clase Fin Clase

// Implementacion de muestra para Circulo // Implementacion de muestra para Rectangulo


Circulo::muestra() Rectangulo::muestra()
{ {
printf("Circulo de radio %f y printf("rectangulo corner (&f,%f)
de centro (%f,%d)\n", y (%f,%d)\n",
radio,x,y); x1,y1,x2,y2);
} }

// Implementacion de area para Circulo // Implementacion de area para Rectangulo


Circulo::area() Rectangulo::area()
{ {
return M_PI*radio*radio; return fabs((x2-x2)*(y2-y1));
} }

2. Programación Orientada a Objetos N. 55 2. Programación Orientada a Objetos N. 56


POO POO

Con POO Con POO


int main()
{ Añadiendo una nueva figura. Queremos
int i; incorporar Triangulo.
Figura s[2];
// Inicializacion de un rectangulo 1 Creamos la clase como derivada de Figura
s[0]=Rectangulo(80.0,30.0,300.0,50.0); Clase Triangulo hereda Figura
// inicializa de un circulo Variables de instancia publicas
s[1]=Circulo(80.0,40.0,30.0); x1,y1,x2,y2,x3,y3
// Computando areas Fin Clase
for (i=0;i<2;i++)
printf("Area figura[%d]=%f\n",i, Triangulo::muestra()
s[i].area()); //vinculación dinamica {
// Mostrando figuras printf( ....
for (i=0;i<2;i++) }
s[i].muestra(); //vinculación dinamica Triangulo::area()
return 0; {
} return ....
}

Este código no es C++. Está subrayado lo que se debe


matizar y usarla del mismo modo que las otras

2. Programación Orientada a Objetos N. 57 2. Programación Orientada a Objetos N. 58

POO POO

Clasificación de los lenguajes CLASE,SUBCLASES E INSTANCIAS


Orientados a Objetos
hereda totalBolas()

Nivel 1. Estructura modular basada en objetos. El sistema está


modularizado en función de las estructuras de datos Urna sacaBola()
blancas
Nivel 2. Abstracción de datos. Los objetos están descritos como
tipos abstractos de datos.
negras
totalBolas() meteBola()
Nivel 3. Recolección automática de basuras. Los objetos no sacaBola()
referenciados deben ser recolectados automáticamente por el sistema. meteBola()
Nivel 4. Clases y módulos. Coherencia sintáctica. quedaBolas() quedanBolas()
quedaMasDeUnaBola()
Nivel 5. Herencia. Una clase puede ser definida como extensión o
restricción de otra.
quedaMasDeUnaBola()
Nivel 6. Polimorfismo. Debe permitirse que las entidades se
refieran a objetos de más de una clase. instancias
Nivel 7. Herencia múltiple. Debe permitirse declarar una clase 23 16 34
como heredera de varias clases. 15 18 11
hereda
cambiaBolas()
1 2 3 4 5 6 7 UrnaTrampa
ADA contExtracciones
sacaBola()
cambiaBolas()
C++ sacaBola()
SMALLTALK
EIFELL
JAVA (*)
hereda instancias
34 32 4
(*) Incluye el concepto de interfaz 45 23 35
6 8 0
2. Programación Orientada a Objetos N. 59 2. Programación Orientada a Objetos N. 60
POO POO

Simula Ejemplo en Simula

1967. Universiad de Oslo Definición de una clase


Class A
Proviene de Simula-1 (simulación) rutinas
begin
Extensión orientada a objetos de Algol-60
cuerpo
end
Introduce el concepto de clase
...
end
Herencia simple
referencia a un objeto
Compilado
ref(A) obj obj es una referencia

Tipado estático Creación de un objeto


Los objetos tienen vida. Son procesos obj :- new A creación de un objeto

Está bien adaptado para simular sistemas paralelos


Ejemplo de herencia
(clases Timer, métodos detach y resume, etc.)
A class B; begin ... end

Está vivo. Refientemente se le incorporó protección y


ocultación

2. Programación Orientada a Objetos N. 61 2. Programación Orientada a Objetos N. 62

POO POO

Smalltalk Eifell

Modelo ortogonal basado en los principios de: Concebido por Bertrand Meyer

Objeto, Clase, Herencia, Mensaje Es un lenguaje nuevo (No basado en otros)

Concebido en su primeras versiones en los 70 por A. Pensado para enfatizar los conceptos de
Kay y A.Golberg en Xerox Parc.
reusabilidad (clases paramétricas, renombrado)
Versiones Smalltalk-72, Smalltalk-76, Smalltalk-80
fiabilidad (pre-postcondiciones, invariantes)
Semicompilado (bytecodes)
Herencia múltiple
Tipado dinámico
Tipado estricto
Herencia simple
Recolector de basuras
Recogida de basura

Es un entorno integrado. Su entorno es el precursor de


todos los entornos gráficos actuales

Buenas herramientas para edición, depurarción e


inspección

Librería de clases extensa

2. Programación Orientada a Objetos N. 63 2. Programación Orientada a Objetos N. 64


POO POO

C++
El nombre C con clases, es cambiado por C++

En 1967 Martin Richars diseña BCPL C++ lo diseña Bjarne Stroustrup en 1980

En 1970 Ken Thompson (Bell Lab.) diseña B En 1983 sale del entorno de Stroustrup

En 1972 Dennis Ritchie diseña C En 1989 se crea el comite para la normalización


de C++ (ANSI)
C mantiene una versión estándar diseñada por
los comites ANSI X3J16

ANSI (CX3J11) y ISO (JTC1SC22WG14) A este se une en junio de 1991 otro comite de la
ISO
En 1989 se estandariza la versión ANSI
ISO WG21
Basado en C, se construye un C con clases.
Tres versiones:
1985

1990

Marzo de 1992. La versión 3.0 de AT&T


incluye la versión ANSI C.

2. Programación Orientada a Objetos N. 65 2. Programación Orientada a Objetos N. 66

POO POO

class PilaChar {
char datos[]; main()
int indice; {
public: // Un objeto "estático"
PilaChar() { PilaChar p;
indice = 0; p.push('h');
datos = new char[100]; p.push('o');
for(int i=0;i<100;i++) datos[i]=0; p.pop();
} // Una referencia a un objeto
push(char s) { PilaChar *q;
if (!this->isFull()) q = new PilaChar();
datos[indice++]=s; q->push('h');
else error("Pila llena"); q->push('o');
} q->pop();
char pop() { delete q;
if (!this->isEmpty()) }
return datos[--indice];
else error("Pila vacia");
}
int isEmpty() {return indice==0;}
int isFull() {return indice==100;}
~PilaChar() {
delete [] datos;
}
};

2. Programación Orientada a Objetos N. 67 2. Programación Orientada a Objetos N. 68


POO POO

Java Pila.java
class PilaChar {
Definido por Sun Microsystems en 1.991 private char datos[];
private int indice;
Basado en C++ public PilaChar() {
datos = new char[100];
indice = 0;
Eliminando cosas poco agradables for (int i=0;i<100;i++)
datos[i]=0;
Añadiendo otras que consideraban que faltaban }
public void push(char s) {
if (!this.isFull())
Es un lenguaje portable
datos[indice++]=s;
else
Pseudocompilado System.out.println("Error. Pila llena");
}
Admite trheads public char pop() {
if (!this.isEmpty())
return datos [--indice];
Tomado como base para el desarrollo de las Web's else {
System.out.println("Error. Pila Vacia");
Incluye una gran librería de clases return 0;
}
I/O, contenedores, sistema gráfico (AWT, SWING) }
public boolean isEmpty() {
return indice ==0;
Herencia simple. Interface }
public boolean isFull() {
Recolector automático de basuras return indice==100;
}
}

2. Programación Orientada a Objetos N. 69 2. Programación Orientada a Objetos N. 70

POO POO

Ejpila.java
import PilaChar;
class Ejpila
{
public static void main(String[] args)
{
PilaChar p = new PilaChar();
p.push('h');
p.push('k');
p.pop();
}
}

2. Programación Orientada a Objetos N. 71 2. Programación Orientada a Objetos N. 72


POO POO

Las figuras en Modula 2 IMPLEMENTATION MODULE Figuras;


IMPORT IO;

PROCEDURE area(VAR Figura : FIGURA) : LONGREAL;


DEFINITION MODULE Figuras; BEGIN
WITH Figura DO
CASE tipo OF
TYPE TIPO = (Circulo, Rectangulo); Circulo: RETURN (2*PI*radio);
| Rectangulo: RETURN ((x2-x1)*(y2-y1));
END;
FIGURA = END;
END area;
RECORD
PROCEDURE muestra(VAR Figura : FIGURA) ;
CASE tipo: TIPO OF BEGIN
Circulo: x,y,radio : LONGREAL; WITH Figura DO
CASE tipo OF
| Rectangulo: x1,y1,x2,y2 : LONGREAL Circulo: WrStr("El area del circulo es ");
END; WrLongReal(area(Figura));
WrLn;
END Rectangulo:
WrStr("El area del Rectangulo es ");
WrLongReal(area(Figura));
(* Calcula el area de una figura *) WrLn;
PROCEDURE area(VAR Figura : FIGURA) : LONGREAL; END;
END;
END muestra;
(* Muestra datos de una figura *)
PROCEDURE creaCirculo(var figura:FIGURA; vx, vy,
PROCEDURE muestra(VAR Figura : FIGURA) ; vr : LONGREAL);
BEGIN
figura.tipo := Circulo;
(* Crea una figura circular *) figura.x := vx;
figura.y := vy;
PROCEDURE creaCirculo(var figura:FIGURA; vx, vy, vr : figura.radio := vr;
LONGREAL); END creaCirculo;

PROCEDURE creaRectangulo(var figura:FIGURA;


(* Crea una figura cuadrangular *) vx1, vy1, vx2, vy2: LONGREAL);
BEGIN
PROCEDURE creaRectangulo(var figura:FIGURA; figura.tipo := Rectangulo;
figura.x1 := vx1;
figura.y1 := vy1;
END Figuras. figura.x2 := vx2;
figura.y2 := y2;
END creaRectangulo;

END Figuras.

2. Programación Orientada a Objetos N. 73 2. Programación Orientada a Objetos N. 74

POO

MODULE PruebaFiguras;
IMPORT Figuras;

VAR m : ARRAY [1..2] OF FIGURA;


i : CARDINAL;

BEGIN

creaCirculo(m[1],10,15,90);
creaRectangulo(m[2],10,15,20,25);

FOR i := 1 TO 2 DO
muestra(m[i]);
END;
END PruebaFiguras.

2. Programación Orientada a Objetos N. 75

You might also like