POO
POO
Smalltalk
POO POO
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
...
POO POO
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
POO POO
Ejemplo
Objeto: Una urna
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
{ totalBolas()
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 ....
}
POO POO
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
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.
POO POO
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)
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
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.
POO POO
POO POO
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
POO POO
POO POO
POO 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
POO POO
Creamos Circulo como subclase de Figura Creamos Rectangulo como subclase de Figura
POO POO
POO POO
Smalltalk Eifell
Modelo ortogonal basado en los principios de: Concebido por Bertrand Meyer
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
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
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
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;
}
};
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;
}
}
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();
}
}
END Figuras.
POO
MODULE PruebaFiguras;
IMPORT Figuras;
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.