Sei sulla pagina 1di 5

Clases abstractas e interfaces

™ A nivel conceptual, las clases abstractas e interfaces


permiten definir qué puede hacer un conjunto o familia de
clases relacionadas.
™ Ejemplo en el contexto de la universidad:
Java: Clases Abstractas e Interfaces
Las “personas” (esto es,
“alumnos”, “profesores” y
“administrativos”)
Franco Guidi Polanco Persona conocen y retornan su
Escuela de Ingeniería Industrial RUT, nombre, teléfono y
Pontificia Universidad Católica de Valparaíso, Chile dirección
fguidi@ucv.cl
Alumno Profesor Administrativo

Actualización: 8 de marzo de 2006


Franco Guidi Polanco 07-03-2007 2

Clases Abstractas Ejemplo de Clase Abstracta

™ Una clase es declarada abstracta cuando no public abstract class Poligono {


es posible crear instancias de ella. int lados; Clase abstracta
™ Una clase debe ser declarada abstracta si public int setLados(int l){
posee al menos un método declarado lados = l;
abstracto. }
™ Un método abstracto es aquél que no provee public abstract double getArea(); Polígono
implementación. ...
Pablo Picasso, Toro (11) }

™ Una subclase de una clase abstracta


puede ser instanciada (es decir, puede
ser “no abstracta”) sólo si provee public class Cuadrado extends Poligono {
implementación para todos los int longitud; Clase concreta
métodos abstractos de la superclase. public double getArea(){ que extiende la
En caso contrario, debe también ser return longitud*longitud; clase abstracta.
declarada abstracta. }
...
}
Franco Guidi Polanco 07-03-2007 3 Franco Guidi Polanco 07-03-2007 4
Interfaces Analogía

™ Una interfaz define un tipo de dato.


™ Contenido de una interfaz:
ƒ Nombre y visibilidad
Destornillador
ƒ Eventuales otras interfaces Clase que debe usar ciertos
extendidas objetos
ƒ Declaraciones de métodos
ƒ Constantes (declaradas como
static final)
Modelos de cabezas
™ Una interfaz no provee: De tornillos Interfaces
ƒ Variables de instancia o de clase
ƒ Implementación para los métodos

™ Útiles cuando una clase debe usar objetos de distintas clases, pero que
operan de la misma forma (ej. un temporizador para videograbador, Clases que implementan
radio, etc.) Tornillos alguna de las interfaces

Franco Guidi Polanco 07-03-2007 5 Franco Guidi Polanco 07-03-2007 6

Ejemplo de Interfaz Ejemplo de Interfaz (cont.)

public interface Despertable {


public static final int DORMIDO = 1; La interfaz public class Alarma { La Alarma es
public static final int DESPIERTO = 2; Despertable ... capaz de “despertar”
public void despierta(); public static void despertar(Despertable d);
} d.despierta();
cualquier objeto
} que implemente la
} interfaz
public class Persona implements Despertable{ Despertable.
int estado = DESPIERTO; Una clase que public class Ejemplo {
public void dormir() {
implementa la public static void main(String[] arg){
estado = Despertable.DORMIDO;
interfaz Persona p1 = new Persona();
}
Alarma.despertar(p1);
public void despierta(){ Despertable
Despertable p2 = new Persona();
estado = DESPIERTO;
Alarma.despertar(p2);
}
}
...
}
}
Franco Guidi Polanco 07-03-2007 7 Franco Guidi Polanco 07-03-2007 8
Uso de Interfaces Interfaces y excepciones

™ Una clase puede implementar múltiples interfaces: ™Las excepiones declaradas en los métodos de una
interfaz (cláusula throws) también deben ser
public class Anfibio implements Terrestre, Acuático { ... }
declaradas en los métodos de las clases que
™ Una interfaz puede extender otras interfaces. implementan la interfaz.
public interface Anfibio extends Terrestre, Acuático { ... }

™ Algunos enuncian que el uso de interfaces representa una


forma de enfrentar el problema de la “herencia múltiple” en
Java.

Franco Guidi Polanco 07-03-2007 9 Franco Guidi Polanco 07-03-2007 10

Ejemplo Ejemplo (cont.)

™ El Aerosub (“Viaje al fondo del mar”) ™ Clase que accede a las funciones del Aerosub:

public interface Aéreo { public class Comandante {


public void despegar(); public Aerosub vehículo;
public void acuatizar();
} public Comandante(Aerosub v){
vehículo = v;
}
public interface Acuático {
public void emerger(); public void comandar(){
public void sumergirse(); …
} vehículo.emerger();

vehículo.despegar();
public class Aerosub implements Aéreo, Acuático{ …
public void despegar(){…} vehículo.acuatizar();
public void acuatizar(){…} …
public void emerger(){…} vehículo.sumergirse();
public void sumergirse(){…} …
} }
}

Franco Guidi Polanco 07-03-2007 11 Franco Guidi Polanco 07-03-2007 12


Atención en el uso de la herencia e implementación de
Ejemplo (cont.) Interfaces
™ Clases que acceden al Aerosub con funcionalidades limitadas: ™ Deben considerarse relaciones con valor semántico en el dominio del
problema. Ejemplos como este pueden no tener sentido:
public class Aviador { public class Marino {
public class ReyDeLaSelva implements Elefante, Pistola
public Aéreo vehículo; public Acuático vehículo;

public Aviador(Aéreo v){ public Marino(Acuático v){ A menos que…


vehículo = v; vehículo = v;
} }

public void pilotear(){ public void navegar(){


… …
vehículo.despegar(); vehículo.sumergirse();
… …
vehículo.acuatizar(); vehículo.emerger();
… …
} }

} }

Franco Guidi Polanco 07-03-2007 13 Franco Guidi Polanco 07-03-2007 14

Ejercicio 1 Ejercicio 1 (cont.)


™ Una empresa desarrolladora de software de monitoreo debe crear aplicaciones Para manejar un public class Muestra {
capaces de obtener datos desde distintos tipos de sensores (de contaminación public static void main( String[] arg ){
por partículas, ruido, voltaje, etc.) y mostrar dichos valores por pantalla. Cada sensor de polvo
DustSensor t = new DustSensor();
aplicación se desarrolla para trabajar con un tipo de sensor. Los sensores son ambiental t.on();
manejados por clases específicas (e.g. TemperatureSensor, DustSensor, etc.) y for(int i=0; i<10000; i++ )
proveen tres métodos: (1) un método para activarlo; (2) un método que System.out.println( t.readMeasure() );
retorna un double correspondiente al valor percibido por el sensor en el t.off();
momento; y (3) un método para desactivarlo. }
Los siguientes son ejemplos de aplicaciones desarrolladas por esta empresa: }

A pesar de lo similar de las aplicaciones, en cada ocasión es necesario reescribir


public class Muestra { no sólo la clase de sensor que se utilizará, sino también las invocaciones
public static void main( String[] arg ){ correspondientes a sus métodos específicos, lo cual hace el desarrollo
Para manejar un TempSensor t = new TempSensor(); ineficiente.
sensor de t.activa(); Se pide determinar una arquitectura que permita a la empresa simplificar su
Temperatura for(int i=0; i<10000; i++ ) trabajo de desarrollo.
System.out.println( t.leeTemp() );
t.desactiva();
}
}

Franco Guidi Polanco 07-03-2007 15 Franco Guidi Polanco 07-03-2007 16


Ejercicio 2 La necesidad de clases abstractas e interfaces

™ Diseñe y programe las clases e interfaces que permiten Situación 1:


resolver el siguiente problema:
™ Contexto: se está desarrollando una
ƒ Se desea construir una clase que permita mantener una colección aplicación que trabaja con CD’s,
de objetos ordenados ascendentemente. DVD’s y discos de vinilo.
ProductoMusical
ƒ Los objetos a ordenar pueden ser de cualquier clase. Los objetos
™ Problema: se establece que a pesar {abstract}
deberán implementar un método que permita determinar si un
objeto es mayor que otro. de tener sus propios atributos, todos código
ellos disponen de código, sello
discográfico y autor. Se desea evitar
sello
duplicidad de código. autor

™ Decisión: se determina la
conveniencia de crear la clase
“ProductoMusical”, que agrupa las CD DVD Vinilo
propiedades comunes de los tres
tipos de productos. La clase
ProductoMusical no es instanciable,
por lo tanto se lo declara abstracto. La superclase aparece por factorización
de propiedades comunes

Franco Guidi Polanco 07-03-2007 17 Franco Guidi Polanco 07-03-2007 18

La necesidad de clases abstractas e interfaces


Discusión
(cont.)
Situación 2: La superclase o interfaz
es impuesta a las subclases.
™Tanto clases abstractas como
™ Contexto: se está desarrollando una interfaces permiten describir
clase Timer para programar distintos
objetos temporizables (ej. relojes, Timer propiedades comunes de
grabadoras, alarmas, etc.) familias de clases.
™ Problema: Los objetos temporizables Temporizable
¿Cuándo conviene utilizar unas
pueden ser distintos, y al momento
de desarrollar el Timer no se sabe
{abstract} u otras?
exactamente de qué clase son.

™ Decisión: se define una interfaz (o


una clase abstracta, si hay código Reloj Grabadora
en común) que implementarán
todos los objetos temporizables. El
Timer accede a los objetos
temporizables a través de esta
interfaz.

Franco Guidi Polanco 07-03-2007 19 Franco Guidi Polanco 07-03-2007 20

Potrebbero piacerti anche