Implementación de Múltiples Interfaces
Parte de la sección Programación Orientada a Objetos del Journey de Java de Coddy. Lección 36 de 87.
A diferencia de la herencia de clases, en la que solo puedes extender una clase, Java permite que una clase implemente múltiples interfaces. Así es como Java logra una forma de herencia múltiple de manera segura.
Para implementar varias interfaces, enuméralas después de la palabra clave implements, separadas por comas:
public interface Drawable {
void draw();
}
public interface Resizable {
void resize(int width, int height);
}
public class Rectangle implements Drawable, Resizable {
private int width, height;
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
@Override
public void draw() {
System.out.println("Drawing rectangle " + width + "x" + height);
}
@Override
public void resize(int width, int height) {
this.width = width;
this.height = height;
}
}La clase debe implementar todos los métodos de cada interfaz que declara. También puedes combinar la herencia con varias interfaces:
public class Square extends Shape implements Drawable, Resizable {
// Debe implementar los métodos de ambas interfaces
// También puede usar los miembros heredados de Shape
}Esta flexibilidad te permite diseñar clases que cumplen múltiples roles. Un SmartPhone podría implementar las interfaces Callable, Messageable y Browsable, cada una de las cuales define diferentes capacidades compatibles con el teléfono.
Desafío
FácilConstruyamos un sistema de dispositivos inteligentes en el que los dispositivos puedan tener varias capacidades. Crearás un SmartTV que pueda encenderse/apagarse y cuyo volumen pueda controlarse: así demostrarás cómo una sola clase puede implementar varias interfaces para cumplir diferentes funciones.
Organizarás tu código en cuatro archivos:
Powerable.java: Define una interfaz para dispositivos que puedan encenderse. Debe declarar dos métodos:powerOn()ypowerOff(), ambos con retorno void.VolumeControl.java: Define una interfaz para dispositivos con control de volumen. Debe declarar un métodosetVolume(int level)que retorne void y un métodogetVolume()que retorne un int.SmartTV.java: Crea una clase que implemente las interfacesPowerableyVolumeControl. Tu SmartTV debe tener un campobrand(String), un campoisOn(boolean, inicialmente false) y un campovolume(int, inicialmente 0). Incluye un constructor que reciba el nombre de la marca. Implementa todos los métodos requeridos:powerOn()debe establecerisOnen true e imprimir:[brand] TV is now ONpowerOff()debe establecerisOnen false e imprimir:[brand] TV is now OFFsetVolume(int level)debe actualizar el volumen e imprimir:[brand] TV volume set to [level]getVolume()debe devolver el volumen actual
Main.java: Reúne todo para demostrar la implementación de varias interfaces. Recibirás dos entradas: un nombre de marca (String) y un nivel de volumen (int). Crea un SmartTV con la marca indicada y, después:- Llama a
powerOn() - Llama a
setVolume()con el nivel indicado - Imprime:
Current volume: [volume]usandogetVolume() - Llama a
powerOff()
- Llama a
Recibirás dos entradas: la marca del TV (String) y el nivel de volumen (int).
Tu salida debe mostrar cuatro líneas que demuestren cómo tu SmartTV cumple ambos contratos de interfaz. ¡Puede encenderse como cualquier dispositivo Powerable y controlar su volumen como cualquier dispositivo VolumeControl!
Pruébalo tú mismo
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Leer entradas
String brand = scanner.nextLine();
int volumeLevel = scanner.nextInt();
// TODO: Crea un SmartTV con la marca dada
// TODO: Llama a powerOn()
// TODO: Llama a setVolume() con el nivel dado
// TODO: Print: Current volume: [volume] using getVolume()
// TODO: Llama a powerOff()
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosIntroducción a la OOPClases vs. ObjetosLa palabra clave thisMétodosCampos (Atributos)Método constructorSobrecarga de constructoresResumen - Calculadora simple4Herencia
Herencia básica (extends)La palabra clave superSobrescritura de métodos (@Override)Encadenamiento de constructoresLa clase ObjectHerencia simple y multinivelPor qué no hay herencia múltiple de clasesResumen - Jerarquía de empleados7Métodos especiales y la clase Object
Método toString()equals() y hashCode()Método clone()compareTo() y ComparableInterfaz ComparatorResumen - Ordenamiento personalizado2Modificadores de acceso y encapsulamiento
Visión general de los niveles de accesoMétodos Getter y SetterOcultamiento de informaciónLa palabra clave finalResumen - Gestor de cuentas bancarias5Polimorfismo
Fundamentos de sobrecarga de métodosSobrescritura de métodos (tiempo de ejecución)Upcasting y DowncastingEl operador instanceofClases y métodos abstractosResumen - Calculadora de figuras8Conceptos avanzados de POO
Composición vs. HerenciaAgregación vs. ComposiciónClases internas, anidadas y anónimasEnums y métodos de EnumRecords (Java 16+)Clases selladas (Java 17+)11Patrones de diseño - Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón BuilderPatrón ObserverPatrón Strategy3Propiedades de clase y miembros estáticos
Variables de instancia vs. estáticasMétodos estáticosBloques estáticosConstantes (static final)Repaso - Contador y utilidad6Interfaces y Clases Abstractas
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesMétodos Default y Static en InterfacesClases Abstractas vs InterfacesInterfaces FuncionalesResumen - Sistema de Pagos9Genéricos
Introducción a los genéricosClases genéricasMétodos genéricosParámetros de tipo delimitadosComodines (?, extends, super)Resumen - Contenedor genérico12Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón IteratorPractica por tu cuenta: Compilador de Java online