Múltiplas Interfaces
Parte da seção Programação Orientada a Objetos do Journey de Dart da Coddy — lição 48 de 110.
Uma das maiores vantagens das interfaces sobre a herança é que uma classe pode implementar múltiplas interfaces. Enquanto o Dart restringe você a estender apenas uma classe, você pode implementar quantas interfaces precisar.
abstract class Printable {
void printContent();
}
abstract class Saveable {
void save();
}
abstract class Shareable {
void share(String recipient);
}
class Document implements Printable, Saveable, Shareable {
String content;
Document(this.content);
@override
void printContent() {
print('Printing: $content');
}
@override
void save() {
print('Saving document...');
}
@override
void share(String recipient) {
print('Sharing with $recipient');
}
}Ao implementar múltiplas interfaces, você deve fornecer implementações para todos os métodos de cada interface. A classe deve cumprir todos os contratos que ela promete suportar.
Você também pode combinar extends com múltiplos implements:
class Report extends Document implements Printable, Shareable {
Report(String content) : super(content);
// Ainda deve implementar todos os métodos da interface
// (já herdados de Document neste caso)
}Essa flexibilidade permite que você projete classes que se encaixam em múltiplos papéis. Um SmartPhone poderia implementar as interfaces Camera, Phone e MusicPlayer, prometendo que pode fazer tudo o que cada interface exige, mantendo sua própria implementação única.
Desafio
FácilVamos construir um sistema de dispositivos inteligentes que demonstra como uma única classe pode implementar múltiplas interfaces para combinar diferentes capacidades. Você criará classes de interface separadas para diferentes recursos de dispositivos e, em seguida, construirá um dispositivo que pode fazer tudo.
Você organizará seu código em dois arquivos:
devices.dart: Defina suas interfaces e a classe de implementação aqui:- Uma classe
Connectablecom um métodoconnect()que imprimeConnecting to network... - Uma classe
Chargeablecom um métodocharge()que imprimeCharging battery... - Uma classe
Displayablecom um métodoshowScreen(String content)que imprimeDisplaying: [content] - Uma classe
Tabletque implementa as três interfaces:Connectable,ChargeableeDisplayable. Adicione uma propriedadeString brandcom um construtor. Suas implementações devem imprimir[brand] tablet connecting to WiFipara connect,[brand] tablet charging via USB-Cpara charge e[brand] screen: [content]para showScreen
- Uma classe
main.dart: Importe seu arquivo de dispositivos e demonstre como o Tablet cumpre todos os três contratos de interface:- Crie um
Tabletcom a marca'Galaxy' - Chame
connect() - Chame
charge() - Chame
showScreen('Welcome Home')
- Crie um
Sua classe Tablet deve fornecer sua própria implementação para cada método de todas as três interfaces. Isso mostra como a implementação de múltiplas interfaces permite que uma única classe prometa múltiplas capacidades, mantendo cada implementação única para o dispositivo.
Saída esperada:
Galaxy tablet connecting to WiFi
Galaxy tablet charging via USB-C
Galaxy screen: Welcome HomeFolha de consulta
Uma classe pode implementar múltiplas interfaces listando-as após a palavra-chave implements, separadas por vírgulas:
abstract class Printable {
void printContent();
}
abstract class Saveable {
void save();
}
class Document implements Printable, Saveable {
@override
void printContent() {
print('Printing...');
}
@override
void save() {
print('Saving...');
}
}Ao implementar múltiplas interfaces, você deve fornecer implementações para todos os métodos de cada interface.
Você pode combinar extends com múltiplos implements:
class Report extends Document implements Printable, Shareable {
Report(String content) : super(content);
// Deve implementar todos os métodos da interface
}Isso permite que uma classe cumpra múltiplos contratos e se ajuste a múltiplos papéis simultaneamente.
Experimente você mesmo
import 'devices.dart';
void main() {
// TODO: Crie um Tablet com a marca 'Galaxy'
// TODO: Chame connect()
// TODO: Chame charge()
// TODO: Chame showScreen('Welcome Home')
}
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 ExternosBibliotecas e ImportaçõesIntrodução à POOClasses vs ObjetosA Palavra-chave thisMétodosVariáveis de InstânciaFundamentos de ConstrutoresRecapitulação - Calculadora Simples4Null Safety
Introdução ao Null SafetyNullable vs Non-NullableOs Operadores ? e !Palavra-chave Late e Null SafetyOperadores Null-AwareNull Safety em ClassesRecapitulação - Sistema de Perfil de Usuário7Classes Abstratas e Interfaces
Classes AbstratasMétodos AbstratosInterfaces em DartInterfaces ImplícitasImplementando vs EstendendoMúltiplas InterfacesRecapitulação - Calculadora de Formas10Coleções e Generics
Visão Geral de List, Set e MapColeções Type-SafeClasses GenéricasMétodos GenéricosRestrições de GenericsIterable e IteratorRecapitulação - Armazenamento Genérico13Conceitos Avançados de POO
Composição vs HerançaMétodos de ExtensãoClasses ChamáveisClasses Seladas (Dart 3)Records (Dart 3)Patterns & Matching (3.0)Enums com Métodos16Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses Livro e Usuário2Construtores em Dart
Construtor PadrãoConstrutores NomeadosListas de InicializaçãoConstrutores ConstantesConstrutores FactoryConstrutores de RedirecionamentoRecapitulação - Shape Builder5Encapsulamento
Membros Públicos vs PrivadosA Convenção do Prefixo _Privacidade em Nível de BibliotecaAprofundamento em Getters & SettersOcultação de InformaçãoRecapitulação - Registros de Estudantes8Mixins
Introdução aos MixinsCriando MixinsUsando Múltiplos MixinsPalavra-chave on em MixinsMixin vs HerançaMixin vs InterfaceRecapitulação - Sistema Animal11Métodos Especiais
Sobrescrita de toString()Sobrescrita de hashCode & ==Interface ComparableMétodo call()Sobrescrita de noSuchMethodRecapitulação - Coleção Personalizada14Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão Strategy3Propriedades de Classe
Membros de Instância vs EstáticosCampos Final & ConstVariáveis LateMétodos e Campos EstáticosGetters e SettersRecapitulação - Gerenciador de Conta Bancária6Herança
Herança BásicaA Palavra-chave superSobrescrita de MétodoA Anotação @overrideA Palavra-chave final para ClassesConstrutores e HerançaRecapitulação - Hierarquia de Funcionários9Polimorfismo
Fundamentos do PolimorfismoPolimorfismo via InterfacesVerificação de Tipos em Tempo de ExecuçãoOs Operadores is & asPalavra-chave CovariantRecapitulação - Processador de Pagamentos12POO Assíncrona
Futures e async/awaitFundamentos de StreamsStream ControllersConstrutores AssíncronosAsync em Métodos de ClasseRecapitulação - Data Fetcher15Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Repository