Una promesa que otros cumplen
Pagas en el bar. Puedes hacerlo en efectivo, con tarjeta o con el móvil.
El camarero no pregunta cómo funciona cada forma. Solo sabe que todas cumplen una promesa: sirven para pagar.
En Java hay dos herramientas para esto: las clases abstractas y las interfaces.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Clase abstracta | Una clase padre incompleta. No se puede crear con new, solo sirve para heredar de ella. | abstract class Subscription |
| Método abstracto | Un método sin cuerpo. Cada clase hija está obligada a escribirlo. | abstract double monthlyPrice(); |
| Interfaz | Una lista de métodos prometidos, todos sin cuerpo. | interface Rechargeable |
| implements | La palabra con la que una clase dice que cumple una interfaz. | class Phone implements Rechargeable |
| Contrato | Lo que una clase promete tener, sin decir cómo lo hace. | minutesToFull() |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un padre que deja un hueco
Piensa en una suscripción del móvil: música, vídeo, deporte. Todas tienen un nombre y un precio al mes.
Pero no existe una "suscripción cualquiera". Siempre es una concreta. Y cada una cobra un precio distinto.
Por eso creamos una clase abstracta. Escribe lo que es común y deja un método abstracto para el precio.
Pruébalo: suscripciones
abstract class Subscription {
String name;
Subscription(String name) { this.name = name; }
// El padre no sabe el precio: lo dirá cada hija.
abstract double monthlyPrice();
String summary() {
return name + ": " + monthlyPrice() + " euros al mes";
}
}
class MusicPlan extends Subscription {
MusicPlan() { super("Música"); }
@Override double monthlyPrice() { return 10.0; }
}
class VideoPlan extends Subscription {
VideoPlan() { super("Vídeo"); }
@Override double monthlyPrice() { return 6.5; }
}
public class Main {
public static void main(String[] args) {
System.out.println(new MusicPlan().summary());
System.out.println(new VideoPlan().summary());
}
}
Repaso rápido
Inténtalo
Repaso rápido
3 preguntasTus respuestas se corrigen aquí y no se guardan. Una cuenta guarda tus resultados.
Ejemplo resuelto: qué compila y qué no
| Línea | ¿Compila? | Por qué |
|---|---|---|
| new Subscription("Extra") | No | La clase es abstracta |
| new MusicPlan() | Sí | Es una clase completa |
| Subscription s = new VideoPlan(); | Sí | Una variable del padre guarda una hija |
| s.summary() | Sí | Escribe "Vídeo: 6.5 euros al mes" |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Una lista de promesas
A veces las clases no se parecen en nada. Un móvil y un patinete eléctrico no tienen un padre común. Pero los dos se enchufan.
Una interfaz es una lista de métodos prometidos. Escribes interface, y cada método va sin cuerpo.
Una clase dice implements y cumple la promesa escribiendo cada método.
Pruébalo: cosas que se enchufan
interface Rechargeable {
int minutesToFull();
}
class Phone implements Rechargeable {
public int minutesToFull() { return 90; }
}
class Scooter implements Rechargeable {
public int minutesToFull() { return 240; }
}
public class Main {
public static void main(String[] args) {
Rechargeable[] things = {new Phone(), new Scooter()};
int total = 0;
for (int i = 0; i < things.length; i++) {
System.out.println("Tarda " + things[i].minutesToFull() + " minutos.");
total = total + things[i].minutesToFull();
}
System.out.println("En total: " + total + " minutos.");
}
}