Menu
Coddy logo textTech

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 múltiplas interfaces, você deve fornecer implementações para todos os métodos de cada interface. A classe deve cumprir todos os contratos que ela 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 encaixam em múltiplos papéis. Um SmartPhone poderia implementar as interfaces Camera, Phone e MusicPlayer, prometendo que pode fazer tudo o que cada interface exige, mantendo sua própria implementação única.

challenge icon

Desafio

Fácil

Vamos construir um sistema de dispositivos inteligentes que demonstra como uma única classe pode implementar múltiplas interfaces para combinar diferentes capacidades. Você criará classes de interface separadas para diferentes recursos de dispositivos e, em seguida, construirá um dispositivo que pode fazer tudo.

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

  • devices.dart: Defina suas interfaces e a classe de implementação aqui:
    • Uma classe Connectable com um método connect() que imprime Connecting to network...
    • Uma classe Chargeable com um método charge() que imprime Charging battery...
    • Uma classe Displayable com um método showScreen(String content) que imprime Displaying: [content]
    • Uma classe Tablet que implementa as três interfaces: Connectable, Chargeable e Displayable. Adicione uma propriedade String brand com um construtor. Suas implementações devem imprimir [brand] tablet connecting to WiFi para connect, [brand] tablet charging via USB-C para charge e [brand] screen: [content] para showScreen
  • main.dart: Importe seu arquivo de dispositivos e demonstre como o Tablet cumpre todos os três contratos de interface:
    • Crie um Tablet com a marca 'Galaxy'
    • Chame connect()
    • Chame charge()
    • Chame showScreen('Welcome Home')

Sua classe Tablet deve fornecer sua própria implementação para cada método de todas as três interfaces. Isso mostra como a implementação de múltiplas interfaces permite que uma única classe prometa múltiplas capacidades, mantendo cada implementação única para o dispositivo.

Saída esperada:

Galaxy tablet connecting to WiFi
Galaxy tablet charging via USB-C
Galaxy screen: Welcome Home

Folha de consulta

Uma classe pode implementar múltiplas interfaces listando-as após a palavra-chave implements, separadas por vírgulas:

abstract class Printable {
  void printContent();
}

abstract class Saveable {
  void save();
}

class Document implements Printable, Saveable {
  @override
  void printContent() {
    print('Printing...');
  }
  
  @override
  void save() {
    print('Saving...');
  }
}

Ao implementar múltiplas interfaces, você deve fornecer implementações para todos os métodos de cada interface.

Você pode combinar extends com múltiplos implements:

class Report extends Document implements Printable, Shareable {
  Report(String content) : super(content);
  
  // Deve implementar todos os métodos da interface
}

Isso permite que uma classe cumpra múltiplos contratos e se ajuste a múltiplos papéis simultaneamente.

Experimente você mesmo

import 'devices.dart';

void main() {
  // TODO: Crie um Tablet com a marca 'Galaxy'
  
  // TODO: Chame connect()
  
  // TODO: Chame charge()
  
  // TODO: Chame showScreen('Welcome Home')
  
}
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