Menu
Coddy logo textTech

Interfaces múltiples

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

Una de las mayores ventajas de las interfaces sobre la herencia es que una clase puede implementar múltiples interfaces. Mientras que Dart te restringe a extender solo una clase, puedes implementar tantas interfaces como necesites.

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');
  }
}

Al implementar múltiples interfaces, debe proporcionar implementaciones para todos los métodos de cada interfaz. La clase debe cumplir con todos los contratos que promete soportar.

También puedes combinar extends con múltiples implements:

class Report extends Document implements Printable, Shareable {
  Report(String content) : super(content);
  
  // Aún debe implementar todos los métodos de la interfaz
  // (ya heredados de Document en este caso)
}

Esta flexibilidad te permite diseñar clases que se adaptan a múltiples roles. Un SmartPhone podría implementar las interfaces Camera, Phone y MusicPlayer, prometiendo que puede hacer todo lo que cada interfaz requiere mientras mantiene su propia implementación única.

challenge icon

Desafío

Fácil

Vamos a construir un sistema de dispositivos inteligentes que demuestre cómo una sola clase puede implementar múltiples interfaces para combinar diferentes capacidades. Crearás clases de interfaz separadas para diferentes características de dispositivos y luego construirás un dispositivo que pueda hacerlo todo.

Organizarás tu código en dos archivos:

  • devices.dart: Define tus interfaces y la clase que las implementa aquí:
    • Una clase Connectable con un método connect() que imprima Connecting to network...
    • Una clase Chargeable con un método charge() que imprima Charging battery...
    • Una clase Displayable con un método showScreen(String content) que imprima Displaying: [content]
    • Una clase Tablet que implemente las tres interfaces: Connectable, Chargeable y Displayable. Añade una propiedad String brand con un constructor. Tus implementaciones deben imprimir [brand] tablet connecting to WiFi para connect, [brand] tablet charging via USB-C para charge, y [brand] screen: [content] para showScreen
  • main.dart: Importa tu archivo de dispositivos y demuestra cómo la Tablet cumple con los tres contratos de interfaz:
    • Crea una Tablet con la marca 'Galaxy'
    • Llama a connect()
    • Llama a charge()
    • Llama a showScreen('Welcome Home')

Tu clase Tablet debe proporcionar su propia implementación para cada método de las tres interfaces. Esto muestra cómo la implementación de múltiples interfaces permite que una sola clase prometa múltiples capacidades manteniendo cada implementación única para el dispositivo.

Salida esperada:

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

Hoja de referencia

Una clase puede implementar múltiples interfaces enumerándolas después de la palabra clave implements, separadas por comas:

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...');
  }
}

Al implementar múltiples interfaces, debes proporcionar implementaciones para todos los métodos de cada interfaz.

Puedes combinar extends con múltiples implements:

class Report extends Document implements Printable, Shareable {
  Report(String content) : super(content);
  
  // Debe implementar todos los métodos de la interfaz
}

Esto permite que una clase cumpla con múltiples contratos y se adapte a múltiples roles simultáneamente.

Pruébalo tú mismo

import 'devices.dart';

void main() {
  // TODO: Crea una Tablet con la marca 'Galaxy'
  
  // TODO: Llama a connect()
  
  // TODO: Llama a charge()
  
  // TODO: Llama a showScreen('Welcome Home')
  
}
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