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 têm uma palavra-chave interface dedicada, Dart adota uma abordagem diferente. Em Dart, toda classe define automaticamente uma interface. Essa 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 a extends é que 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 decide exatamente como elas funcionarão.

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

challenge icon

Desafio

Fácil

Vamos criar um sistema de reprodução de mídia que demonstra como a palavra-chave implements funciona em Dart. Você criará classes que servem como interfaces e, em seguida, as implementará em um único dispositivo que combina vários recursos.

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

  • media.dart: defina aqui suas classes de interface e a classe que as implementa:
    • 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 implements não herda nenhum código, você deve fornecer suas próprias implementações para ambos os métodos. Seu 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 várias interfaces:
    • Crie uma instância de SmartTV
    • Chame playAudio('Jazz Collection')
    • Chame playVideo('Nature Documentary')

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

Saída esperada:

SmartTV audio: Jazz Collection
SmartTV video: Nature Documentary

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

Pratique por conta própria: Compilador de Dart online