¿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 unmixinen 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.
"
extendses herencia normal: reutilizo el código del padre y solo puedo extender una clase.implementstrata a la clase como una interfaz y me obliga a implementar todo su contrato desde cero, sin heredar código, pero puedo implementar varias. Ywithinyecta 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 hacewith SingleTickerProviderStateMixinpara tener animaciones."
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.