Menu
Coddy logo textTech

Interfaces en Dart

Parte de la sección Programación Orientada a Objetos del Journey de Dart de Coddy — lección 45 de 110.

A diferencia de muchos lenguajes que tienen una palabra clave interface dedicada, Dart adopta un enfoque diferente. En Dart, cada clase define automáticamente una interfaz. Esta interfaz consta de todos los miembros públicos (métodos y propiedades) que la clase declara.

Cuando quieres que una clase prometa que proporcionará cierta funcionalidad sin heredar la implementación, utilizas la palabra clave implements:

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

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

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

La diferencia clave con respecto a extends es que implements no hereda ningún código. Debes proporcionar tu propia implementación para cada método y propiedad definidos en la interfaz. Este es un contrato: estás prometiendo que tu clase tendrá estas capacidades, pero tú decides exactamente cómo funcionan.

Este enfoque le da flexibilidad a Dart. Puedes usar clases abstractas cuando quieras definir interfaces sin implementación, o usar clases regulares como interfaces cuando tenga sentido. La siguiente lección explora cómo funciona este concepto de "interfaz implícita" con más detalle.

challenge icon

Desafío

Fácil

Vamos a construir un sistema de reproductor de medios que demuestre cómo funciona la palabra clave implements en Dart. Crearás clases que sirvan como interfaces y luego las implementarás en un único dispositivo que combine múltiples capacidades.

Organizarás tu código en dos archivos:

  • media.dart: Define tus clases de interfaz y la clase implementadora aquí:
    • Una clase AudioPlayer con un método playAudio(String track) que imprima Playing audio: [track]
    • Una clase VideoPlayer con un método playVideo(String title) que imprima Playing video: [title]
    • Una clase SmartTV que implemente tanto AudioPlayer como VideoPlayer. Dado que implements no hereda ningún código, debes proporcionar tus propias implementaciones para ambos métodos. Tu SmartTV debe imprimir SmartTV audio: [track] para el audio y SmartTV video: [title] para el video
  • main.dart: Importa tu archivo de medios y demuestra cómo una sola clase puede implementar múltiples interfaces:
    • Crea una instancia de SmartTV
    • Llama a playAudio('Jazz Collection')
    • Llama a playVideo('Nature Documentary')

Observa cómo SmartTV debe proporcionar su propia implementación para cada método de ambas interfaces; no hereda las implementaciones originales de AudioPlayer o VideoPlayer. Esta es la diferencia clave entre implements y extends.

Salida esperada:

SmartTV audio: Jazz Collection
SmartTV video: Nature Documentary

Hoja de referencia

En Dart, cada clase define automáticamente una interfaz que consiste en todos sus miembros públicos. Para implementar una interfaz sin heredar código, utiliza la palabra clave implements:

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

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

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

Diferencias clave con respecto a extends:

  • implements no hereda ninguna implementación de código
  • Debes proporcionar tu propia implementación para cada método y propiedad
  • Una clase puede implementar múltiples interfaces
  • Es un contrato que promete que tu clase tendrá estas capacidades

Pruébalo tú mismo

import 'media.dart';

void main() {
  // TODO: Crear una instancia de SmartTV
  
  // TODO: Llamar a playAudio('Jazz Collection')
  
  // TODO: Llamar a playVideo('Nature Documentary')
  
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos