Download Clases abstractas e interfaces en Java

Document related concepts
no text concepts found
Transcript
Clases abstractas e interfaces
en Java
Estructuras de Datos y de la Información
ESI – Curso 2010/2011
Clases abstractas
public abstract class Figura
{
private String _nombre;
public Figura (string nombre) {
_nombre = nombre;
}
final public boolean mayor_que (Figura f) {
return area() > f.area();
}
abstract public float area ();
}
Estructuras de Datos y de la Información
ESI – Curso 2010/2011
Interfaces
public interface Cantante
{
AudioClip cantar (Cancion c);
}
public interface EscritorCanciones
{
Cancion componer (boolean exito);
}
Estructuras de Datos y de la Información
ESI – Curso 2010/2011
Prefer interfaces to abstract classes
●
Principales diferencias...
Estructuras de Datos y de la Información
ESI – Curso 2010/2011
Prefer interfaces to abstract classes
●
Principales diferencias...
–
Implementación de algunos métodos en las
clases abstractas (no en las interfaces).
Estructuras de Datos y de la Información
ESI – Curso 2010/2011
Prefer interfaces to abstract classes
●
Principales diferencias...
–
Implementación de algunos métodos.
public abstract class Figura
{
// Constructor...
final public boolean mayor_que (Figura f) {
return area() > f.area();
}
abstract public float area ();
}
Estructuras de Datos y de la Información
ESI – Curso 2010/2011
Prefer interfaces to abstract classes
●
Principales diferencias...
–
MÁS IMPORTANTE!!!
Para implementar el tipo definido por una clase abstracta,
una clase debe ser una subclase de la clase abstracta.
Estructuras de Datos y de la Información
ESI – Curso 2010/2011
Prefer interfaces to abstract classes
●
Principales diferencias...
–
MÁS IMPORTANTE!!!
Para implementar el tipo definido por una clase abstracta,
una clase debe ser una subclase de la clase abstracta.
Si a este factor le sumamos que Java no permite
herencia múltiple, la restricción sobre clases abstractas
limita severamente su uso como definiciones de tipo.
Estructuras de Datos y de la Información
ESI – Curso 2010/2011
Prefer interfaces to abstract classes
●
Principales diferencias...
–
MÁS IMPORTANTE!!!
Para implementar el tipo definido por una clase abstracta,
una clase debe ser una subclase de la clase abstracta.
En el caso de las interfaces,
la clase que la implemente ha de obedecer el
contrato establecido por dicha interfaz.
Estructuras de Datos y de la Información
ESI – Curso 2010/2011
Prefer interfaces to abstract classes
●
Las interfaces no están ligadas a una jerarquía
rígida...
public interface Cantante
{
AudioClip cantar (Cancion c);
}
public interface EscritorCanciones
{
Cancion componer (boolean exito);
}
Estructuras de Datos y de la Información
ESI – Curso 2010/2011
Prefer interfaces to abstract classes
●
Flexibilidad.
public interface Cantante {
AudioClip cantar (Cancion c);
}
public interface EscritorCanciones {
Cancion componer (boolean exito);
}
public interface Cantautor
extends Cantante, EscritorCanciones {
AudioClip rasguear ();
}
Estructuras de Datos y de la Información
ESI – Curso 2010/2011
Prefer interfaces to abstract classes
●
Flexibilidad.
–
Si usásemos herencia,
2n posibles combinaciones de atributos.
Estructuras de Datos y de la Información
ESI – Curso 2010/2011
Prefer interfaces to abstract classes
●
Ventaja de las clases abstractas.
–
Es más sencillo realizar modificaciones.
–
E.g.: añadir un nuevo método.
●
●
Clase abstracta ---> Implementación por defecto.
Interfaz ---> Casi imposible de cambiar.
–
El nuevo método ha de implementarse en todas y
cada una de las clases que implementan la
interfaz.
Estructuras de Datos y de la Información
ESI – Curso 2010/2011
Prefer interfaces to abstract classes
●
Ventaja de las clases abstractas.
public abstract class Figura
{
// Constructor...
final public boolean mayor_que (Figura f) {
return area() > f.area();
}
abstract public float area ();
}
Estructuras de Datos y de la Información
ESI – Curso 2010/2011
public class Empleado implements Comparable {
private int _id;
private String _nombre;
private double _salario;
static int _i;
public Empleado (String nombre, double sal) {
_id = i++;
_nombre = nombre;
_salario = sal;
}
}
public int compareTo (Object o1) {
if (this._salario == ((Empleado) o1).getSalario())
return 0;
else if ((this._salario) > ((Empleado) o1).getSalario())
return 1;
else
return -1;
}
Estructuras de Datos y de la Información
ESI – Curso 2010/2011
import java.util.*;
public class ComparableDemo {
public static void main(String[] args) {
List ts1 = new ArrayList();
ts1.add(new Empleado ("Tom",40000.00));
ts1.add(new Empleado ("Harry",20000.00));
ts1.add(new Empleado ("Maggie",50000.00));
ts1.add(new Empleado ("Chris",70000.00));
Collections.sort(ts1);
Iterator itr = ts1.iterator();
while(itr.hasNext()){
Object element = itr.next();
System.out.println(element + "\n");
}
}
}
Estructuras de Datos y de la Información
ESI – Curso 2010/2011