Implementação de Múltiplas Interfaces
Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy — lição 36 de 87.
Ao contrário da herança de classes, onde você só pode estender apenas uma classe, o Java permite que uma classe implemente múltiplas interfaces. É assim que o Java alcança uma forma de herança múltipla com segurança.
Para implementar múltiplas interfaces, liste-as após a palavra-chave implements, separadas por vírgulas:
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;
}
}A classe deve implementar todos os métodos de cada interface que ela declara. Você também pode combinar herança com múltiplas interfaces:
public class Square extends Shape implements Drawable, Resizable {
// Deve implementar métodos de ambas as interfaces
// Também pode usar membros herdados de Shape
}Essa flexibilidade permite que você projete classes que desempenham múltiplos papéis. Um SmartPhone poderia implementar as interfaces Callable, Messageable e Browsable, cada uma definindo diferentes capacidades que o telefone suporta.
Desafio
FácilVamos construir um sistema de dispositivos inteligentes onde os dispositivos podem ter múltiplas capacidades. Você criará uma SmartTV que pode ser ligada/desligada e ter seu volume controlado — demonstrando como uma única classe pode implementar múltiplas interfaces para cumprir diferentes papéis.
Você organizará seu código em quatro arquivos:
Powerable.java: Defina uma interface para dispositivos que podem ser ligados. Ela deve declarar dois métodos:powerOn()epowerOff(), ambos retornando void.VolumeControl.java: Defina uma interface para dispositivos com controle de volume. Ela deve declarar um métodosetVolume(int level)que retorna void, e um métodogetVolume()que retorna um int.SmartTV.java: Crie uma classe que implemente as interfacesPowerableeVolumeControl. Sua SmartTV deve ter um campobrand(String), um campoisOn(boolean, inicialmente false) e um campovolume(int, inicialmente 0). Inclua um construtor que receba o nome da marca. Implemente todos os métodos necessários:powerOn()deve definirisOncomo true e imprimir:[brand] TV is now ONpowerOff()deve definirisOncomo false e imprimir:[brand] TV is now OFFsetVolume(int level)deve atualizar o volume e imprimir:[brand] TV volume set to [level]getVolume()deve retornar o volume atual
Main.java: Reúna tudo para demonstrar a implementação de múltiplas interfaces. Você receberá duas entradas: um nome de marca (String) e um nível de volume (int). Crie uma SmartTV com a marca fornecida e, em seguida:- Chame
powerOn() - Chame
setVolume()com o nível fornecido - Imprima:
Current volume: [volume]usandogetVolume() - Chame
powerOff()
- Chame
Você receberá duas entradas: a marca da TV (String) e o nível do volume (int).
Sua saída deve mostrar quatro linhas demonstrando como sua SmartTV cumpre ambos os contratos de interface — ela pode ser ligada como qualquer dispositivo Powerable e ter seu volume controlado como qualquer dispositivo VolumeControl!
Folha de consulta
Uma classe pode implementar múltiplas interfaces listando-as após a palavra-chave implements, separadas por vírgulas:
public class Rectangle implements Drawable, Resizable {
// Deve implementar todos os métodos de ambas as interfaces
}A classe deve implementar todos os métodos de cada interface que ela declara.
Você também pode combinar a herança de classe com a implementação de múltiplas interfaces:
public class Square extends Shape implements Drawable, Resizable {
// Implementa métodos de ambas as interfaces
// Pode usar membros herdados de Shape
}Isso permite que uma classe desempenhe múltiplos papéis e tenha diferentes capacidades.
Experimente você mesmo
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Ler as entradas
String brand = scanner.nextLine();
int volumeLevel = scanner.nextInt();
// TODO: Criar uma SmartTV com a marca fornecida
// TODO: Chamar powerOn()
// TODO: Chamar setVolume() com o nível fornecido
// TODO: Imprimir: Current volume: [volume] usando getVolume()
// TODO: Chamar powerOff()
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosA Palavra-chave thisMétodosCampos (Atributos)Método ConstrutorSobrecarga de ConstrutorRecapitulação - Calculadora Simples4Herança
Herança Básica (extends)A Palavra-chave superSobrescrita de Método (@Override)Encadeamento de ConstrutoresA Classe ObjectHerança Simples e MultinívelPor que não há Herança Múltipla de ClassesRecapitulação - Hierarquia de Funcionários7Métodos Especiais e a Classe Object
Método toString()equals() e hashCode()Método clone()compareTo() e ComparableInterface ComparatorRecapitulação - Ordenação Personalizada2Modificadores de Acesso e Encapsulamento
Visão Geral dos Níveis de AcessoMétodos Getter e SetterOcultação de InformaçõesA Palavra-chave finalRecapitulação - Gerenciador de Conta Bancária5Polimorfismo
Fundamentos de Sobrecarga de MétodosSobrescrita de Métodos (Tempo de Execução)Upcasting e DowncastingO Operador instanceofClasses e Métodos AbstratosRecapitulação - Calculadora de Formas8Conceitos Avançados de OOP
Composição vs HerançaAgregação vs ComposiçãoClasses Internas, Aninhadas e AnônimasEnums e Métodos de EnumRecords (Java 16+)Classes Seladas (Java 17+)11Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão BuilderPadrão ObserverPadrão Strategy3Propriedades de Classe e Membros Estáticos
Variáveis de Instância vs EstáticasMétodos EstáticosBlocos EstáticosConstantes (static final)Recapitulação - Contador e Utilitário6Interfaces e Classes Abstratas
Introdução às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesDefault e Static em InterfacesClasses Abstratas vs InterfacesInterfaces FuncionaisRecapitulação - Sistema de Pagamento9Generics
Introdução a GenericsClasses GenéricasMétodos GenéricosParâmetros de Tipos DelimitadosWildcards (?, extends, super)Recapitulação - Container Genérico12Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Iterator