Las interfaces son útiles porque le permiten cambiar las implementaciones de una clase, al tiempo que permiten la validación de que el tipo que se está entregando cumple con los requisitos de la interfaz.
tomar el ejemplo siguiente (a menudo utilizado):
interface Quackable {
void quack();
}
Esto define los requisitos de una clase que se pasarán a un método tal como:
sayQuack(Quackable quackable) {
quackable.quack();
}
que le permite hacer uso de cualquier implementación de un objeto Quackable, como:
class MockDuck implements Quackable {
void quack() => print("quack");
}
class EnterpriseDuck implements Quackable {
void quack() {
// connect to three enterprise "ponds"
// and eat some server bread
// and say "quack" using an messaging system
}
}
Ambas implementaciones funcionarán con la función sayQuack(), pero una requiere significativamente menos infraestructura que la otra.
sayQuack(new EnterpriseDuck());
sayQuack(new MockDuck());
que utilizan este patrón todo el tiempo en el mundo de Java, en la construcción de soluciones que hacen uso de un poco de "pato de la empresa". Al desarrollar localmente, todo lo que necesito es poder llamar a la función sayQuack() y devolver algunos datos falsos codificados.
pato escribir
Debido dardo se escribe opcionalmente, que en realidad no necesita usar la interfaz, sólo tiene que escribir una clase que contiene la firma del método correcto funcionará (aunque las herramientas no podrán para validarlo).
class Person { // note: no implements keyword
void quack() => "I'm not a duck";
}
sayQuack(new Person()); // provides the quack method, so this will still work
Todas las clases son interfaces
Por último, todas las clases son también las interfaces. Esto significa que, aunque un sistema de terceros se haya escrito sin utilizar interfaces, puede seguir utilizando una clase concreta como si fuera una interfaz.
Por ejemplo, imaginemos la siguiente biblioteca de la empresa:
class EnterpriseDuck { // note: no implements keyword
void quack() {
// snip
}
}
sayQuack(EnterpriseDuck duck) { // takes an instance of the EnterpriseDuck class
duck.quack();
}
y desea pasar un pato simulacro en el método sayQuack de manera que el tipo de corrector puede validar. Usted puede crear su mockDuck para implementar la interfaz implicado por EnterpriseDuck, simplemente usando el EnterpriseDuck como una interfaz:
class MockDuck implements EnterpriseDuck {
void quack() => "I'm a mock enterprise duck";
}
herencia múltiple
En términos de herencia múltiple, esto no es posible en Dart. Puede, sin embargo, implementar múltiples interfaces y ofrecer sus propias implementaciones de los métodos necesarios, por ejemplo:
class MultiDuck implements Quackable, EnterpriseDuck, Swimable {
// snip...
}
Las interfaces pueden tener clases predeterminadas
A medida que usa dardo, se encuentra que la mayoría de las clases" "en realidad son interfaces. List, String, etc ... son todas las interfaces con implementaciones predeterminadas. Cuando se llama a
List myList = new List();
en realidad está utilizando una interfaz de lista, y la nueva palabra clave redirige desde la interfaz a una aplicación lista por defecto subyacente.
lo que respecta a desarrollar en un equipo de
interfaces son útiles en el desarrollo del equipo, incluso en el mundo del código abierto. La interfaz define los métodos y las propiedades que debe construir para que su componente funcione con mi componente. Puedes construir tu propia implementación de prueba de esa interfaz, y puedo construir mi implementación concreta de esa interfaz, y cuando ambos terminemos, podemos integrarnos. Sin la interfaz publicada y compartida, necesitaría proporcionar mi implementación concreta antes de que realmente pueda comenzar.
Espero que ayude!
Muchas gracias, Chris, eso era exactamente lo que necesitaba. Además, los nombres de tus clases en los ejemplos son adorables. – snitko
en "piense", dos de los comentarios de su código: "// nota: ninguna palabra clave de interfaz" en lugar de "// nota: no implementa palabra clave". – GameAlchemist
Considere actualizar esto o agregue un comentario a esta publicación explicando que la palabra clave de la interfaz ya no se usa en Dart. –