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 várias interfaces, você deve fornecer implementações para todos os métodos de cada interface. A classe deve cumprir todos os contratos que 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 adequem a várias funções. Um SmartPhone poderia implementar as interfaces Camera, Phone e MusicPlayer, garantindo que pode fazer tudo o que cada interface exige, enquanto mantém sua própria implementação exclusiva.
Desafio
FácilVamos criar um sistema de dispositivo inteligente que demonstra como uma única classe pode implementar várias interfaces para combinar diferentes capacidades. Você criará classes de interface separadas para diferentes recursos do dispositivo e, em seguida, criará um dispositivo capaz de fazer tudo.
Você organizará seu código em dois arquivos:
devices.dart: Defina suas interfaces e a classe que as implementa 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 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 das três interfaces. Isso mostra como implementar várias interfaces permite que uma única classe prometa várias capacidades, mantendo cada implementação exclusiva para o dispositivo.
Saída esperada:
Galaxy tablet connecting to WiFi
Galaxy tablet charging via USB-C
Galaxy screen: Welcome HomeExperimente você mesmo
import 'devices.dart';
void main() {
// TODO: Criar um Tablet com a marca 'Galaxy'
// TODO: Chamar connect()
// TODO: Chamar charge()
// TODO: Chamar 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 OOP
Arquivos externosBibliotecas e importsIntrodução à OOPClasses vs. objetosA palavra-chave thisMétodosVariáveis de instânciaNoções básicas de construtoresRevisão - Calculadora simples4Segurança contra nulos
Introdução à segurança contra nulosAnulável vs. não anulávelOs operadores ? e !Palavra-chave Late e segurança contra nulosOperadores conscientes de nulosSegurança contra nulos em classesRecapitulação — Sistema de perfil de usuário7Classes Abstratas e Interfaces
Classes AbstratasMétodos AbstratosInterfaces em DartInterfaces ImplícitasImplementação vs. ExtensãoMúltiplas InterfacesRecapitulação - Calculadora de Formas10Coleções e Genéricos
Visão geral de List, Set e MapColeções com segurança de tiposClasses genéricasMétodos genéricosRestrições genéricasIterable e IteratorRecapitulação - Armazenamento genérico13Conceitos Avançados de OOP
Composição vs. HerançaMétodos de ExtensãoClasses ChamáveisClasses Seladas (Dart 3)Registros (Dart 3)Padrões e Correspondência (3.0)Enums com Métodos16Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses de Livros e Usuários2Construtores em Dart
Construtor padrãoConstrutores nomeadosListas de inicializaçãoConstrutores constantesConstrutores factoryConstrutores de redirecionamentoRevisão - Construtor de formas5Encapsulamento
Membros Públicos vs. PrivadosConvenção do Prefixo _Privacidade no Nível da BibliotecaAprofundamento em Getters e SettersOcultação de InformaçõesRecapitulação - Registros de Alunos8Mixins
Introdução a MixinsCriando MixinsUsando vários MixinsPalavra-chave on em MixinsMixin vs HerançaMixin vs InterfaceRecapitulação - Sistema de Animais11Métodos Especiais
Sobrescrita de toString()Sobrescrita de hashCode e ==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 e ConstVariáveis LateMétodos e Campos EstáticosGetters e SettersRecapitulação - Gerenciador de Contas Bancárias6Herança
Herança BásicaA Palavra-chave superSobrescrita de MétodosA Anotação @overrideA Palavra-chave final para ClassesConstrutores e HerançaRecapitulação - Hierarquia de Funcionários9Polimorfismo
Fundamentos do polimorfismoPolimorfismo por meio de interfacesVerificação de tipos em tempo de execuçãoOs operadores is e asPalavra-chave covarianteRecapitulação — Processador de pagamentos12OOP Assíncrona
Futures e async/awaitNoções básicas de StreamsControladores de StreamConstrutores assíncronosAsync em métodos de classeRecapitulação — Buscador de dados15Padrões de Projeto — Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão RepositoryPratique por conta própria: Compilador de Dart online