Menu
Coddy logo textTech

Interfaces em Dart

Parte da seção Programação Orientada a Objetos do Journey de Dart da Coddy — lição 45 de 110.

Ao contrário de muitas linguagens que possuem uma palavra-chave interface dedicada, o Dart adota uma abordagem diferente. No Dart, toda classe define automaticamente uma interface. Esta interface consiste em todos os membros públicos (métodos e propriedades) que a classe declara.

Quando você quer que uma classe prometa que fornecerá certa funcionalidade sem herdar a implementação, você usa a palavra-chave implements:

class Printer {
  void printDocument(String content) {
    print('Printing: $content');
  }
}

class Scanner {
  void scan() {
    print('Scanning document');
  }
}

// MultiFunctionDevice deve implementar TODOS os métodos de ambas as classes
class MultiFunctionDevice implements Printer, Scanner {
  @override
  void printDocument(String content) {
    print('MFD printing: $content');
  }
  
  @override
  void scan() {
    print('MFD scanning');
  }
}

A principal diferença em relação ao extends é que o implements não herda nenhum código. Você deve fornecer sua própria implementação para cada método e propriedade definidos na interface. Isso é um contrato — você está prometendo que sua classe terá essas capacidades, mas você decide exatamente como elas funcionam.

Essa abordagem dá flexibilidade ao Dart. Você pode usar classes abstratas quando quiser definir interfaces sem implementação, ou usar classes regulares como interfaces quando fizer sentido. A próxima lição explora como esse conceito de "interface implícita" funciona em mais detalhes.

challenge icon

Desafio

Fácil

Vamos construir um sistema de player de mídia que demonstra como a palavra-chave implements funciona no Dart. Você criará classes que servem como interfaces e depois as implementará em um único dispositivo que combina múltiplas capacidades.

Você organizará seu código em dois arquivos:

  • media.dart: Defina suas classes de interface e a classe de implementação aqui:
    • Uma classe AudioPlayer com um método playAudio(String track) que imprime Playing audio: [track]
    • Uma classe VideoPlayer com um método playVideo(String title) que imprime Playing video: [title]
    • Uma classe SmartTV que implementa tanto AudioPlayer quanto VideoPlayer. Como o implements não herda nenhum código, você deve fornecer suas próprias implementações para ambos os métodos. Sua SmartTV deve imprimir SmartTV audio: [track] para áudio e SmartTV video: [title] para vídeo
  • main.dart: Importe seu arquivo de mídia e demonstre como uma única classe pode implementar múltiplas interfaces:
    • Crie uma instância de SmartTV
    • Chame playAudio('Jazz Collection')
    • Chame playVideo('Nature Documentary')

Observe como a SmartTV deve fornecer sua própria implementação para cada método de ambas as interfaces - ela não herda as implementações originais de AudioPlayer ou VideoPlayer. Esta é a principal diferença entre implements e extends.

Saída esperada:

SmartTV audio: Jazz Collection
SmartTV video: Nature Documentary

Folha de consulta

Em Dart, cada classe define automaticamente uma interface que consiste em todos os seus membros públicos. Para implementar uma interface sem herdar código, use a palavra-chave implements:

class Printer {
  void printDocument(String content) {
    print('Printing: $content');
  }
}

class Scanner {
  void scan() {
    print('Scanning document');
  }
}

// Deve implementar TODOS os métodos de ambas as classes
class MultiFunctionDevice implements Printer, Scanner {
  @override
  void printDocument(String content) {
    print('MFD printing: $content');
  }
  
  @override
  void scan() {
    print('MFD scanning');
  }
}

Principais diferenças em relação ao extends:

  • implements não herda nenhuma implementação de código
  • Você deve fornecer sua própria implementação para cada método e propriedade
  • Uma classe pode implementar múltiplas interfaces
  • É um contrato prometendo que sua classe terá essas capacidades

Experimente você mesmo

import 'media.dart';

void main() {
  // TODO: Criar uma instância de SmartTV
  
  // TODO: Chamar playAudio('Jazz Collection')
  
  // TODO: Chamar playVideo('Nature Documentary')
  
}
quiz iconTeste seus conhecimentos

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