Tema 7 Relación de clases - Polimorfismo, extensión (2015)

Apunte Español
Universidad Universidad Politécnica de Madrid (UPM)
Grado Ingeniería de Tecnologías y Servicios de Telecomunicación - 1º curso
Asignatura Programación
Año del apunte 2015
Páginas 8
Fecha de subida 26/09/2017
Descargas 0
Subido por

Vista previa del texto

TEMA 7: RELACIÓN DE CLASES: Polimorfismo, extensión 7.1. Polimorfismo. Interfaces.
Polimorfismo = varias formas.
*Polimorfismo: Varias clases que se parecen. Permite usar objetos de varias clases distintas que se usan como si fuesen de la misma clase. Ejemplo: class Antena ~ class TMovil Para que se parezcan  Tienen que tener al menos una cabecera pública igual.
public class Antena { private Punto posicion; public Punto getPosicion () { return this.posicion; } } public class TMovil { public Punto getPosicion () { //operaciones } } *Interface: Es una especie de clase vacía. Empiezan por “interface” public interface Ubicado { public Punto getPosicion (); } Solo puedo poner cabeceras públicas y, como mucho, constantes.
No puedo poner atributos, cuerpos de métodos ni constructores.
En el ejemplo de poner un método común a varias clases: ese método puede tener distintos cuerpos en cada clase que se usa dicho método.
7.2. Implementación de interfaces Para implementar una clase con una interfaz: public interface Ubicado { public Punto getPosicion (); } public class Antena implements Ubicado { public Punto getPosicion () { …… } } public class TMovil implements Ubicado { public Punto getPosicion () { …….
} } public AntenaCamion implements Ubicado { public Punto getPosicion () { } 7.3. Uso de interfaces Ubicado u = null, Ubicado u ≠ new Ubicado (); //No se puede hacer u.getPosicion (); 1. Generalización => upcasting u = new Antena (); u = new TMovil (); Solo se puede crear con clases que implementan la interfaz.
if ( u != null) System.out.println (u.getPosicion () ); 2. Especialización => downcasting Hace que la referencia de la interfaz lo fuerce y use sus métodos.
u = new TMovil (); ( (TMovil) u).enviaVideosAAbuela (); Si u no apunta a telefono => Error (classCastException) Para evitar errores: if (u interfaceof TMovil) { ( (TMovil) u).enviaVideosAAbuela (); } ¿Por qué usar interfaces? En otra clase: Distancias de todos los elementos entre sí.
Método 1: Sin interfaces: class Simulador { public double distanciaMoviles (TMovil a, TMovil b) { return a.getPosicion().distancia (b.getPosicion () ); } public double distanciaMovilAntena (TMovil M1, Antena A1) { return M1.getPosicion().distancia (A1.getPosicion () ); } //Y así con todos los elementos.
} Método 2: Con interfaces public class Simulador { public double distancia (Ubicado a1, Ubicado a2) { return a1.getPosicion().distancia (a2.getPosicion () ); } } Con un solo método tenemos la posibilidad de calcular las distancias entre todos los elementos. Únicamente hace falta decir que es a1 y a2 en la clase simulador.
7.4. Jerarquías de interfaces <<interface>> Ubicado Antena <<interface>> Movil TMovil interface Movil { public void mover (Punto p); } En un juego: <<interface>> Ubicado <<interface>> Sonoro <<interface>> Visible Pared <<interface>> Movil Enemigo 7.5. Extensión Crear una clase nueva, tomando una que ya existe y añadiendo métodos y atributos nuevos.
(es-un).
Objeto Punto Pixel public class Pixel extends Punto { private String color; public String getColor () { return this.color; } public void setColor (String color) { this.color = color; } } Clase Base Clase Derivada 7.6. Efectos 1) Extensión parte pública: Si creamos un objeto de la clase derivada, este tiene todos los métodos de su clase más los de la clase base.
Pixel px = new Pixel (); px.setColor (“PURPURA”); px.setX(10.0); px.setY(-10.0); 2) Extensión de la implementación (parte privada): Si creamos un objeto de la derivada, existe otro objeto completo de la clase base.
super => llama al cosntructor de la clase base.
public class Pixel extends Punto { public Pixel (String color, double x, double y); super (x, y); //Tiene que estar en la 1º sentencia del constructor this.color = color; } } Para acceder a los métodos: super.setX(x); super.setY(y); //Este es mejor ó this.setX (x); this.setY (y); protected (atributo): Sirve para que solo puedan usarlo las clases descendientes.
public Pixel (string color, double x, double y) throws Exception { super (x,y); if ( (color == null) || color.equals (“ “) ) throw new Exception (“NO COLOR”); this.color = color; } public class Pixel extends Punto { private String color; ……….
public String toString () { return “[ “ + this.getX() + “ , “ + this.getY() + “ , “ + this.color + “ ] “; //otra forma: //return “ [ “ + super.toString() + “ , “ +this.color + “ ] “; 7.7. Jerarquías de extensiones Objeto c Punto Dirección Paquete 2 Pixel upcasting Object o = new Pixel (-); Object p = new Pixel (-); Object o2 = new Punto (-); downcasting Object o = new Pixel (-); if (o instanceof Pixel) ((Pixel) o).setColor (“PURPLE”); Distribuidor n *Extensión forzada: Una clase abstracta es una interfaz con atributos, cuerpos, etc.
abstract class Movil { protected Punto p; abstract public void mover (double t); } class MovilLineal extends Movil { public void mover (double t) { … … } } Cuando en una jerarquía de herencia hay varias clases con métodos con la misma cabecera, el último sombrea a los superiores.
*Extensión prohibida: final class Login { private String user; … … … public boolean final login (String user, String pswd) { return (user.equals (this.user) && (this.consultaBD (user, pswd) ); } } class HackerMalo extends Login { public boolean login (String user, String pswd) { return true; } } Login l = new HackerMalo (); l.login (“yo”, “soy el malo”); //Sombreado //Sombreado y entras…..
Para evitar el sombreado en un método se pone final en el método original.
Para evitar el sombreado en una clase se pone final en el principio de la clase original.
...

Comprar Previsualizar