← Flutter & Dart

Dart avanzado

¿Cuál es la diferencia entre `extends`, `implements` y `with` (mixins) en Dart?

Ver respuesta — intenta responderla en voz alta primero

extends hereda de una sola clase padre y reutiliza su código. implements obliga a re-implementar todo el contrato de una clase o interfaz, sin heredar su código. with (mixins) permite reutilizar código de varias clases sin herencia múltiple tradicional. Dart no tiene herencia múltiple de clases, pero los mixins llenan ese hueco.

  • extends: herencia clásica. Reutilizas la implementación del padre y puedes sobrescribir (@override) lo que quieras. Solo puedes extender una clase.
  • implements: usas una clase como interfaz. Te comprometes a implementar todos sus métodos y propiedades desde cero; no heredas nada de código. Puedes implementar varias.
  • with (mixin): inyectas métodos y propiedades de un mixin en tu clase. Es la forma de Dart de compartir código entre clases sin una jerarquía de herencia. Puedes combinar varios mixins.
class Animal {
  void respirar() => print("Respirando...");
}

// Mixin: código reutilizable para "inyectar"
mixin Nadador {
  void nadar() => print("Nadando...");
}

mixin Volador {
  void volar() => print("Volando...");
}

// extends (hereda código) + with (mezcla mixins)
class Pato extends Animal with Nadador, Volador {
  void presentarse() => print("Soy un pato");
}

// implements: obliga a reimplementar todo el contrato
class Robot implements Nadador {
  @override
  void nadar() => print("Nadando con motores");
}

void main() {
  final pato = Pato();
  pato.respirar(); // heredado de Animal
  pato.nadar(); // del mixin Nadador
  pato.volar(); // del mixin Volador
  pato.presentarse();

  Robot().nadar(); // "Nadando con motores"
}

Usar implements cuando en realidad querías reutilizar código. Con implements no heredas nada: si implementas una clase con 10 métodos, tienes que escribir los 10, aunque solo te interese cambiar uno. Si lo que quieres es reutilizar la implementación existente, usa extends o un mixin with.

"extends es herencia normal: reutilizo el código del padre y solo puedo extender una clase. implements trata a la clase como una interfaz y me obliga a implementar todo su contrato desde cero, sin heredar código, pero puedo implementar varias. Y with inyecta mixins, que son la forma de Dart de compartir código entre clases sin herencia múltiple. Un ejemplo típico es un widget que hace with SingleTickerProviderStateMixin para tener animaciones."

Reto rápido

Si una clase hace class Gato extends Animal implements Mascota with Jugueton, ¿cuál es el orden correcto de las palabras clave?

Ver respuesta

El orden correcto es: extends, luego with, y al final implements:

class Gato extends Animal with Jugueton implements Mascota { }

El orden importa en Dart: primero de qué heredas, luego qué mezclas, y al final qué contratos implementas.