Herencia En Java Parte 2

download Herencia En Java Parte 2

of 68

Transcript of Herencia En Java Parte 2

Tema 3 Herencia en Java, parte 2Programacin Orientada a Objetos Curso 2010/2011

ContenidoGenericidad. Colecciones. Patrones de Diseo:Mtodo plantilla. Estrategia. Composicin.

Curso 2010/2011

Programacin Orientada a Objetos

2

GenericidadFacilidad de un lenguaje de programacin para definir clases parametrizadas con tipos de datos. Resultan de utilidad para la implementacin de tipos de datos contenedores como las colecciones. La genericidad slo tiene sentido en lenguajes con comprobacin esttica de tipos, como Java o C#. La genericidad permite escribir cdigo reutilizable.Curso 2010/2011 Programacin Orientada a Objetos 3

Clase Contenedorpublic class Contenedor { private T contenido; public void setContenido(T contenido) { this.contenido = contenido; } public T getContenido() { return contenido; } }Curso 2010/2011 Programacin Orientada a Objetos 4

GenericidadLa parametrizacin de una clase genrica se realiza en la declaracin de una variable y en la construccin.

Contenedor contenedor = new Contenedor(); contenedor.setContenido("hola");

Curso 2010/2011

Programacin Orientada a Objetos

5

Operaciones sobre tipos genricosPodemos aplicar la asignacin (=) y la comparacin de identidad (== o !=). Tambin las operaciones aplicables sobre cualquier objeto (mtodos de la clase Object) Dentro de la clase genrica, no es posible construir objetos de un tipo genrico:T contenido = new T(); // No compila

Es posible aplicar ms operaciones aplicando genericidad restringida.Curso 2010/2011 Programacin Orientada a Objetos 6

GenericidadUna clase genrica es una clase normal, salvo que dentro de su declaracin utiliza un tipo variable (parmetro), que ser definido cuando sea utilizada. Dentro de una clase genrica se pueden utilizar otras clases genricas. Una clase genrica puede tener varios parmetros.public class ContenedorDoble { private String nombre; private Contenedor clave; private K valor; } ContenedorDoble contenedor = Curso 2010/2011 Programacin Orientada a Objetos 7

Genericidad y tipos primitivosLas clases genricas no pueden ser parametrizadas a tipos primitivos. Para resolver este problema el lenguaje define clases envoltorio de los tipos primitivos:Integer, Float, Double, Character, Boolean, etc.

El compilador transforma automticamente tipos primitivos en clases envoltorio y viceversa: autoboxing.Contenedor contenedor = new Contenedor(); contenedor.setContenido(10); int valor = contenedor.getContenido();Curso 2010/2011 Programacin Orientada a Objetos 8

Genericidad restringidaObjetivo: limitar los tipos a los que puede ser parametrizada una clase genrica. Al restringir los tipos obtenemos el beneficio de poder aplicar mtodos sobre los objetos de tipo genrico. Una clase con genericidad restringida slo permite ser parametrizada con tipos compatibles con el de la restriccin (clase o interfaz).

Curso 2010/2011

Programacin Orientada a Objetos

9

Genericidad restringidaLa clase CarteraAhorro slo puede ser parametrizada con tipos compatibles con Deposito. Podemos aplicar mtodos disponibles en la clase Deposito.public class CarteraAhorro { private LinkedList contenido; public void liquidar() { for (T deposito : contenido) deposito.liquidar(); } }Curso 2010/2011 Programacin Orientada a Objetos 10

Genericidad restringidaSon equivalentes?public class CarteraAhorro { private LinkedList contenido; public void insertar(T deposito) { contenido.add(deposito); } } public class CarteraAhorro { private LinkedList contenido; public void insertar(Deposito deposito) { contenido.add(deposito); } }Curso 2010/2011 Programacin Orientada a Objetos 11

Genericidad restringidaCon genericidad restringida podemos declarar la siguiente variable:CarteraAhorro seguro = ;

Es posible especificar el tipo de depsito de la cartera, compatible con Deposito. En el ejemplo slo podran introducirse depsitos garantizados y subtipos.

En cambio, con la segunda declaracin no podemos restringir el tipo de depsito. Podemos mezclar distintos tipos de objetos depsito.

Curso 2010/2011

Programacin Orientada a Objetos

12

Genericidad restringidaUna clase genrica puede estar restringida por varios tipos:public class Contenedor

Por tanto, las operaciones disponibles para objetos de tipo T son las de todos los tipos.

Curso 2010/2011

Programacin Orientada a Objetos

13

Genericidad y herenciaUna clase puede heredar de una clase genrica. La nueva clase tiene las opciones:Mantener la genericidad de la clase padre.public class CajaSeguridad extends Contenedor

Restringir la genericidad.public class CajaSeguridad extends Contenedor

No ser genrica y especificar un tipo concreto.public class CajaSeguridad extends Contenedor

Curso 2010/2011

Programacin Orientada a Objetos

14

Genericidad y sistema de tiposContenedor Deposito

No hay relacinDepositoEstructurado Contenedor

Contenedor cDeposito; Contenedor cEstructurado; cDeposito = cEstructurado; // No compila

Curso 2010/2011

Programacin Orientada a Objetos

15

Genericidad y sistema de tiposCuando se declara una variable cuyo tipo se corresponde con una clase genrica y no se especifica el parmetro se asigna el tipo puro (raw) que corresponde a:Sin genericidad restringida, la clase Object. Con genericidad restringida, la clase a la que se restringe.

Contenedor contenedor = new Contenedor(); // Object CarteraAhorro cartera = new CarteraAhorro(); // Deposito

Siendo:Clase Contenedor Clase CarteraAhorroCurso 2010/2011 Programacin Orientada a Objetos 16

Genericidad y tipos comodnEl mtodo slo permite objetos de tipo List.public double posicionGlobal(List depositos) { double posicion = 0; for (Deposito deposito : depositos) { posicion += deposito.getCapital(); } return posicion; }

Cmo podemos pasar un lista de depsitos estructurados?Curso 2010/2011 Programacin Orientada a Objetos 17

Genericidad y tipos comodnpublic double posicionGlobal( List