Criando Mixins
Parte da seção Programação Orientada a Objetos do Journey de Dart da Coddy. Lição 51 de 110.
Agora que você entende o que são mixins, vamos ver como criá-los corretamente. Um mixin é declarado usando a palavra-chave mixin em vez de class.
mixin Logging {
void log(String message) {
print('[LOG] $message');
}
void logError(String error) {
print('[ERROR] $error');
}
}Mixins podem conter métodos, propriedades e até mesmo getters e setters - assim como as classes. No entanto, há uma regra importante: mixins não podem ter construtores. Como os mixins devem ser "misturados" em vez de instanciados diretamente, eles não precisam de lógica de inicialização.
mixin Timestamped {
DateTime createdAt = DateTime.now();
String get formattedTime => createdAt.toString();
void printTimestamp() {
print('Created at: $formattedTime');
}
}
class Document with Timestamped {
String title;
Document(this.title);
}
void main() {
var doc = Document('Report');
doc.printTimestamp(); // Usa o método do mixin
print(doc.createdAt); // Usa a propriedade do mixin
}Quando você aplica um mixin com with, todos os seus membros passam a fazer parte da sua classe. A classe pode usá-los diretamente, assim como qualquer código que tenha uma instância dessa classe. Isso torna os mixins uma maneira organizada de adicionar funcionalidades reutilizáveis sem a complexidade das hierarquias de herança.
Desafio
FácilVamos criar um sistema de mensagens que demonstra como criar mixins com métodos, propriedades e getters. Você projetará um mixin que adiciona recursos de formatação a diferentes tipos de mensagens.
Você organizará seu código em dois arquivos:
messaging.dart: Defina seu mixin e suas classes de mensagem aqui:- Um mixin
Formattableque contém:- Uma propriedade
String prefixinicializada como'>>>' - Um getter
separatorque retorna' | ' - Um método
format(String text)que retorna a string[prefix][separator][text] - Um método
formatBold(String text)que retorna**[text]**
- Uma propriedade
- Uma classe
TextMessageque usa o mixinFormattable. Adicione uma propriedadeString sendercom um construtor. Inclua um métodosend(String content)que imprime o resultado da chamada deformat()com[sender]: [content] - Uma classe
AlertMessageque também usa o mixinFormattable. Adicione uma propriedadeString levelcom um construtor. Inclua um métodoalert(String content)que imprime o resultado da chamada deformat()com[[level]] [formatBold(content)]
- Um mixin
main.dart: Importe seu arquivo de mensagens e demonstre como os dois tipos de mensagem obtêm recursos de formatação do mixin:- Crie um
TextMessagecom o remetente'Alice' - Crie um
AlertMessagecom o nível'WARNING' - Chame
send('Hello there!')na mensagem de texto - Chame
alert('System overload')na mensagem de alerta
- Crie um
Seu mixin demonstra que os mixins podem conter propriedades com valores padrão, getters que calculam valores e vários métodos que podem até chamar uns aos outros. As duas classes de mensagem obtêm toda essa funcionalidade simplesmente usando a palavra-chave with.
Saída esperada:
>>> | Alice: Hello there!
>>> | [WARNING] **System overload**Experimente você mesmo
import 'messaging.dart';
void main() {
// TODO: Crie um TextMessage com o remetente 'Alice'
// TODO: Crie um AlertMessage com o nível 'WARNING'
// TODO: Chame send('Hello there!') na mensagem de texto
// TODO: Chame alert('System overload') na mensagem de alerta
}
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