Menu
Coddy logo textTech

Polimorfismo por meio de interfaces

Parte da seção Programação Orientada a Objetos do Journey de Dart da Coddy. Lição 58 de 110.

Na lição anterior, você viu o polimorfismo por meio da herança - usando um tipo de classe pai para trabalhar com objetos filhos. Mas o polimorfismo também funciona por meio de interfaces, e essa abordagem costuma ser mais flexível.

Quando as classes implementam a mesma interface, você pode tratá-las polimorficamente, mesmo que não tenham uma relação de herança:

abstract class Printable {
  void printDetails();
}

class Invoice implements Printable {
  @override
  void printDetails() => print('Invoice #1234');
}

class Report implements Printable {
  @override
  void printDetails() => print('Monthly Report');
}

class Receipt implements Printable {
  @override
  void printDetails() => print('Receipt for purchase');
}

void printAll(List<Printable> items) {
  for (var item in items) {
    item.printDetails();
  }
}

void main() {
  var documents = [Invoice(), Report(), Receipt()];
  printAll(documents);
}

Invoice, Report e Receipt são classes completamente não relacionadas - elas não compartilham um pai. Ainda assim, como todas implementam Printable, podemos armazená-las na mesma lista e chamar printDetails() em cada uma.

Isso é poderoso porque permite definir contratos de comportamento sem impor uma hierarquia de herança. Qualquer classe pode implementar uma interface, independentemente do que ela estenda. Seu código se torna mais modular, pois você pode adicionar novos tipos imprimíveis sem modificar o código existente — basta implementar a interface.

challenge icon

Desafio

Fácil

Vamos criar um sistema de reprodutor de mídia que demonstra polimorfismo por meio de interfaces. Você criará uma interface que define o que significa ser "reproduzível" e, em seguida, implementará vários tipos de mídia não relacionados que cumprem esse contrato, permitindo que sejam tratados de maneira uniforme apesar de não terem uma relação de herança.

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

  • media.dart: defina sua interface e suas classes de mídia aqui:
    • Uma classe abstrata Playable com dois métodos abstratos: play() e String getMediaType()
    • Uma classe Song que implementa Playable. Ela deve ter um String title e um String artist. Seu método play() exibe Playing song: [title] by [artist] e getMediaType() retorna 'Audio'
    • Uma classe Video que implementa Playable. Ela deve ter um String title e um int duration (em minutos). Seu método play() exibe Playing video: [title] ([duration] min) e getMediaType() retorna 'Video'
    • Uma classe Podcast que implementa Playable. Ela deve ter um String title e um int episode. Seu método play() exibe Playing podcast: [title] - Episode [episode] e getMediaType() retorna 'Podcast'
    Crie também uma função playAll(List<Playable> playlist) que percorra a lista e, para cada item, exiba [Media Type]:, seguido da chamada de play() nesse item.
  • main.dart: importe seu arquivo de mídia e demonstre o polimorfismo baseado em interfaces:
    • Crie uma List<Playable> contendo uma Song com o título 'Imagine' e o artista 'John Lennon', um Video com o título 'Dart Tutorial' e duração 15, e um Podcast com o título 'Tech Talk' e episódio 42
    • Passe essa lista para playAll()

Observe como Song, Video e Podcast não compartilham nenhuma classe pai — são tipos completamente não relacionados. No entanto, como todos implementam Playable, você pode armazená-los na mesma lista e tratá-los uniformemente por meio da interface.

Saída esperada:

Audio:
Playing song: Imagine by John Lennon
Video:
Playing video: Dart Tutorial (15 min)
Podcast:
Playing podcast: Tech Talk - Episode 42

Experimente você mesmo

import 'media.dart';

void main() {
  // TODO: Crie uma List<Playable> contendo:
  // - Uma Song com o título 'Imagine' e o artista 'John Lennon'
  // - Um Video com o título 'Dart Tutorial' e a duração 15
  // - Um Podcast com o título 'Tech Talk' e o episódio 42
  
  // TODO: Passe a lista para playAll()
}
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