You are on page 1of 7

Contenidos

! Abstraccin
! Definicin de clases e interfaces
Tcnicas de POO ! Mensajes y mtodos
! Herencia de clases
Programacin Orientada a Objetos ! Composicin de objetos
Facultad de Informtica

Juan Pavn Mestras


Dep. Sistemas Informticos y Programacin
Universidad Complutense Madrid

Juan Pavn Mestras


Facultad de Informtica UCM, 2004-05 2

Abstraccin Abstraccin

! Definicin ! Formas de abstraccin en OO


! Suprimir o esconder algunos detalles de un proceso o ! Interfaz vs. Implementacin
artefacto con el propsito de resaltar ms claramente otros Definicin de la signatura de las operaciones (interfaz)
aspectos, detalles o estructura
Implementacin de las operaciones (clase)
! Ocultar informacin, o encapsulado, en programacin,
Puede haber varias implementaciones de una misma interfaz
consiste en omitir detalles de implementacin
! Permite gestionar la complejidad
! Divisin en partes: tiene-un (agregacin)
! Ejemplo de niveles de abstraccin: mapas
Permite bajar a otro nivel de complejidad
! Un mapa del mundo muestra continentes, grandes cordilleras
y ros La composicin es un tipo especial de agregacin
! Un mapa de un continente muestra todos los pases y las ! Divisin en especializacin: es-un (herencia)
ciudades principales Permite categorizar informacin
! Un mapa de un pas muestra las principales ciudades y
carreteras ! Paquetes (package en Java, namespace en C++): controla la
! Un mapa de una ciudad muestra las calles visibilidad de una coleccin de objetos respecto al resto
! Cada nivel tiene informacin apropiada al nivel de public, private, protected
abstraccin

Juan Pavn Mestras Juan Pavn Mestras


Facultad de Informtica UCM, 2004-05 3 Facultad de Informtica UCM, 2004-05 4
Definicin de clases Definicin de clases

! Las clases proporcionan: ! C++


! Encapsulado, ocultamiento de informacin, reduciendo la
cantidad de detalles que deben recordar/comunicar los class CartaBaraja {
programadores public:
! Una visin de servicio: la posibilidad de caracterizar un enum Palos {Oros, Copas, Espadas, Bastos};
objeto por el servicio que proporciona, sin saber cmo realiza
su tarea
Palos palo () { return valorPalo; }
! Instanciacin: la posiblidad de crear mltiples instancias de
una abstraccin int numero () { return valorNumero; }

private:
! Dos visiones del software:
Palos valorPalo;
! Externa: lo que hace un objeto
int valorNumero;
Visin de servicio: interfaz
};
! Interna: cmo lo hace
Visin de implementacin

Juan Pavn Mestras Juan Pavn Mestras


Facultad de Informtica UCM, 2004-05 5 Facultad de Informtica UCM, 2004-05 6

Definicin de clases Definicin de clases

! C# ! Java

enum Palos {Oros, Copas, Espadas, Bastos}; class CartaBaraja {


public Palos palo () { return valorPalo; }
// En C# un enum no puede definirse dentro de una clase
public int numero () { return valorNumero; }

class CartaBaraja { private Palos valorPalo;


public Palos palo () { return valorPalo; } private int valorNumero;
public int numero () { return valorNumero; }
public static final int Oros = 1;
private Palos valorPalo; public static final int Copas = 2;
private int valorNumero; public static final int Espadas = 3;
}; public static final int Bastos = 4;
};

En Java, hasta la versin 1.4 no se pueden definir enum

Juan Pavn Mestras Juan Pavn Mestras


Facultad de Informtica UCM, 2004-05 7 Facultad de Informtica UCM, 2004-05 8
Clases anidadas Interfaces en Java

! En C++, C# y Java se pueden definir clases anidadas ! Una interfaz (interface en Java) slo puede definir la
dentro de otras signatura de mtodos y constantes
! Varias clases pueden implementar la misma interfaz
class ListaEnlazada { ! Se puede definir una variable del tipo de interfaz que
//... referencie a objetos de cualquiera de esas clases
private class Enlace { // clase anidada
public int valor; interface
interfaceAutomovil
Automovil{{
public Enlace siguiente; public
publicvoid
voidarrancar();
arrancar();
} public
publicvoid
voidacelerar(double
acelerar(double
a);
a);
} class
//
//...
... classCoche
Cocheimplements
implementsAutomovil
Automovil{{
};}; public
publicvoidvoidarrancar()
arrancar(){{
! Tienen acceso a los miembros de la clase que las contiene /*
/*implementacin
implementacin*/ */ }}
public
public void acelerar(doublea)
void acelerar(double a){{
! Se pueden esconder de otras clases
/*
/*implementacin
implementacin*/ */ }}
//
//...
...
};};
Juan Pavn Mestras Juan Pavn Mestras
Facultad de Informtica UCM, 2004-05 9 Facultad de Informtica UCM, 2004-05 10

Mensajes Definicin de mtodos

! Un mensaje no es una funcin ! Todos los mtodos se definen por:


! Un mensaje se enva siempre a un objeto, el receptor ! Un nombre
! La accin que se realiza la determina el receptor, diferentes ! Una signatura: tipo de argumentos y valor de retorno
receptores pueden tomar distintas acciones Mtodos con el mismo nombre se pueden distinguir por tener signaturas
distintas
! Todos los mensajes tienen tres partes:
! Un cuerpo: cdigo que se ejecutar cuando se invoque el mtodo
! El receptor del mensaje
! El selector del mensaje
! Mtodos
! Una lista opcional de argumentos
! Constructores
Mtodos de Acceso (get) y Modificacin (set)
juego.muestraCarta (unaCarta, 12, 8);
!
Para ver/modificar el valor de los atributos
Permiten definir un atributo como readonly si slo hay el mtodo getX()
! El mtodo asociado al mensaje se puede determinar Permiten cambiar la representacin interna del atributo, o aadir
funcionalidad (por ejemplo, contar el nmero de accesos)
! En tiempo de compilacin: vinculacin esttica
Se asocia al tipo de la variable ! Operaciones
! En tiempo de ejecucin: vinculacin dinmica ! Finalizadores (destructor en C++)
Se asocia al valor

Juan Pavn Mestras Juan Pavn Mestras


Facultad de Informtica UCM, 2004-05 11 Facultad de Informtica UCM, 2004-05 12
Definicin de mtodos Definicin de mtodos

! Consejo: Orden de definicin de los mtodos ! Separacin de declaracin e implementacin


! Primero los ms importantes ! Por ejemplo, en C++
! Los constructores son importantes, ponerlos al principio Legibilidad: Poner en la definicin de clase solo aquellos mtodos
muy cortos
! Poner antes los mtodos pblicos que los privados
Semntica: Algunos compiladores expanden en-lnea el cdigo
! Agrupar cuando haya muchos mtodos de los mtodos definidos en la clase
! Listarlos en orden alfabtico
fichero
ficherocartas.h
cartas.h
! Recuerda que el cdigo no lo lee nicamente el programador
class
classCartaBaraja
CartaBaraja{{
que lo escribe y piensa en los lectores de tu cdigo
public:
public:
//
//...
...
Palos
Palospalo
palo()();; fichero
ficherocartas.cpp
cartas.cpp
// ...
// ...
};}; CartaBaraja::
CartaBaraja::Palos
Palos CartaBaraja::palo
CartaBaraja::palo()(){{
return
returnvalorPalo
valorPalo
};};

Juan Pavn Mestras Juan Pavn Mestras


Facultad de Informtica UCM, 2004-05 13 Facultad de Informtica UCM, 2004-05 14

Curiosidades Ejemplo

! Oberon (N. Wirth) es un lenguaje donde no se definen ! Las 8 reinas


clases, sino registros, as que los mtodos (mensajes) se ! Colocar 8 reinas en un tablero de ajedrez sin que se puedan
definen sobre punteros comer unas a otras

TYPE
CartaBaraja = POINTER TO DescripcionCartaBaraja;
DescripcionCartaBaraja = RECORD
palo : INTEGER;
numero : INTEGER;
visible: BOOLEAN;
END

PROCEDURE (carta: CartaBaraja) setVisible (b : BOOLEAN);


BEGIN
carta.visible = b;
END

Juan Pavn Mestras Juan Pavn Mestras


Facultad de Informtica UCM, 2004-05 15 Facultad de Informtica UCM, 2004-05 16
Herencia de clases Herencia de clases

! Jerarqua de clases ! En C++


! Los atributos y mtodos del padre son parte del hijo class Circulo: public Forma, public Redondez
Obsrvese que los aspectos private del padre son parte del hijo
(por ejemplo, se les asigna memoria en el hijo tambin) pero el ! C++ soporta herencia mltiple
hijo no puede acceder a ellos (slo a los declarados como public
o protected)
! En C#
! La herencia es extensin y contraccin class Circulo: Forma
! El comportamiento del hijo puede extender al del padre
! El hijo puede redefinir comportamiento heredado ! En Java
! Motivacin de la herencia class Circulo extends Forma

! Reutilizacin de cdigo: el hijo hereda el cdigo del padre


! C# y Java slo permiten herencia de una clase pero se pueden
! Reutilizacin de concepto: el hijo puede redefinir todos los
implementar mltiples interfaces
mtodos heredados, pero comparte su definicin
! Tambin definen una sola raz de la jerarqua de clases: la clase
Object (C++ no)
La clase Object proporciona mtodos bsicos para todos los objetos: equals(),
toString(), finalize(), clone(), hashcode() [C# los ha copiado de Java]

Juan Pavn Mestras Juan Pavn Mestras


Facultad de Informtica UCM, 2004-05 17 Facultad de Informtica UCM, 2004-05 18

Herencia de clases Formas de la Herencia [T. Budd, cap. 8 de la 3 edicin]

! Para referirse a un mtodo de la clase padre ! Especializacin: los hijos sobreescriben un mtodo del padre para
especializar la clase de alguna manera
! En C++ y Java: super ! Ejemplo: los componentes del Java AWT
! En C#: base ! Especificacin: si la clase padre es abstracta est dando una
especificacin de cmo tienen que ser las hijas
! Al crear un objeto se llama a los constructores de las ! Ejemplo: eventos en Java: ActionListener, MouseListener
clases a las que pertenece, del primero al ms particular: ! Construccin: Se utiliza una clase para construir otra, que no respeta la
! En el ejemplo: Automovil(), Coche(), Taxi() relacin es un
! Derivar una clase Conjunto de una clase Lista
! Para el destructor en sentido inverso: ! No respeta el principio de sustituibilidad
Automovil
! Taxi(), Coche(), Automovil() ! Generalizacin o extensin: la clase hija no sobreescribe ningn
mtodo de la clase padre, slo aade otros nuevos
! Ejemplo: En java.util Properties extends Hashtable
! Limitacin: la clase hija restringe el uso de algn mtodo de la clase
Coche Camion padre (sobreescribindolo, por ejemplo, para que genere un mensaje de
error)
! Con el ejemplo de la Lista, para crear una Pila se suprime el mtodo de
insertar donde no sea el extremo de la pila
! Varianza: Cuando varias clases estn relacionadas, crear una que tenga
los aspectos comunes de ambas
Particular Taxi Patrulla
! Combinacin: Una clase hija hereda de varias (herencia mtliple)
Juan Pavn Mestras Juan Pavn Mestras
Facultad de Informtica UCM, 2004-05 19 Facultad de Informtica UCM, 2004-05 20
Composicin de objetos Herencia vs. Composicin

! Agregar o componer varios objetos para obtener una ! Herencia: permite definir una clase a partir de otra
mayor funcionalidad ! Reutilizacin de caja blanca: los aspectos internos de la
! Un objeto se puede construir a partir de otros objetos superclase son visibles a las subclases
! Soportada por el lenguaje de programacin
! Esttica: se define en tiempo de compilacin

! Composicin: nueva funcionalidad mediante composicin


de objetos
! Reutilizacin de caja negra: no hay visibilidad de los aspectos
internos de los objetos (objetos como cajas negras)
! Requiere interfaces bien definidas
! Dinmica: se define en tiempo de ejecucin

Juan Pavn Mestras Juan Pavn Mestras


Facultad de Informtica UCM, 2004-05 21 Facultad de Informtica UCM, 2004-05 22

Herencia vs. Composicin Herencia vs. Composicin

! La herencia no permite cambios en tiempo de ejecucin ! La composicin es dinmica, en tiempo de ejecucin


! La herencia rompe la encapsulacin ! Los objetos adquieren referencias de otros objetos
! La herencia impone al menos una parte de la representacin ! Los objetos tienen que respetar las interfaces de los otros
fsica a las subclases objetos
! Cambios en la superclase pueden afectar a las subclases Exige un diseo cuidadoso de las interfaces
! Las implementaciones de superclase y subclases estn ! Hay menos dependencias de implementacin
ligadas ! Habr ms objetos en el sistema y por tanto el
! Si hacen falta cambios para reutilizar una clase en nuevos comportamiento del sistema depender de las interacciones
dominios de aplicacin habr que cambiarla entre objetos en vez de estar definido en una clase
! Limita la flexibilidad y al final la reutilizacin
! Por ello es ms prctico utilizar interfaces y clases
abstractas
! Ya que proporcionan menos o ninguna implementacin

Juan Pavn Mestras Juan Pavn Mestras


Facultad de Informtica UCM, 2004-05 23 Facultad de Informtica UCM, 2004-05 24
Herencia vs. Composicin Herencia vs. Composicin

! Por tanto, ! Delegacin de objetos como alternativa a la herencia


es preferible la composicin de objetos ! En la delegacin un objeto que recibe una peticin delega la
a la herencia de clases ejecucin del mtodo a otro objeto (el delegado)
En el fondo esto es lo que hace una subclase respecto a la
superclase (al objeto this)
! Sin embargo, ! Ejemplo: la clase Ventana, en vez de heredar de Rectangulo
! El conjunto de componentes (objetos) no suele ser lo (aunque las ventanas son rectangulares) tiene una referencia
suficientemente rico en la prctica a un objeto asociado de esa clase y delega algunas
! Mediante herencia se pueden crear nuevos componentes que operaciones en ella
componer con los existentes Si hiciera falta cambiar la forma de la ventana en tiempo de
ejecucin, por ejemplo a Circulo, bastara con cambiar la
referencia del objeto correspondiente
! La herencia y la composicin trabajan juntas

Juan Pavn Mestras Juan Pavn Mestras


Facultad de Informtica UCM, 2004-05 25 Facultad de Informtica UCM, 2004-05 26

Herencia vs. Composicin Bibliografa

! Ejemplo de delegacin de objetos como alternativa a la herencia ! Bsico:


! T. Budd, An introduction to Object-Oriented Programming (Third
Edition). Pearson Education, 2001
Rectangulo
ancho Rectangulo ! Otros:
alto VentanaGUI rectangulo ancho ! E. Gamma, R. Helm, R. Johnson, J. Vlissides, Design Paterns:
alto Elements of Reusable Object-Oriented Software. Addison-Wesley,
area() area() 1994
area() ! B. Stroustrup, The C++ Programming Language (Third Edition).
Addison-Wesley, 1997

VentanaGUI return rectangulo.area() return ancho * ! Agustn Froufe. Java 2. Manual de usuario y tutorial. Ed. Ra-Ma
alto
! J. Snchez, G. Huecas, B. Fernndez y P. Moreno, Iniciacin y
area() referencia: Java 2. Osborne McGraw-Hill, 2001.
! B. Meyer, Object-Oriented Software Construction (Second Edition).
Prentice Hall, 1997

Juan Pavn Mestras Juan Pavn Mestras


Facultad de Informtica UCM, 2004-05 27 Facultad de Informtica UCM, 2004-05 28

You might also like