Le interfacce sono utili perché consentono di cambiare le implementazioni di una classe, consentendo comunque la convalida che il tipo che viene passato soddisfa i requisiti dell'interfaccia.
adottare le seguenti (spesso usato) Esempio:
interface Quackable {
void quack();
}
Questa definisce i requisiti di una classe che saranno passate a un metodo come:
sayQuack(Quackable quackable) {
quackable.quack();
}
che consente di fare uso di qualsiasi implementazione di un oggetto Quackable, ad esempio:
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
}
}
Entrambe queste implementazioni funzioneranno con la funzione sayQuack(), ma una richiede un'infrastruttura significativamente inferiore rispetto alle altre.
sayQuack(new EnterpriseDuck());
sayQuack(new MockDuck());
Io uso questo schema tutto il tempo nel mondo Java, per la costruzione di soluzioni che fanno uso di qualche "anatra impresa". Quando si sviluppa localmente, tutto ciò di cui ho semplicemente bisogno è poter chiamare la funzione sayQuack() e restituire alcuni dati fittizi e fittizi.
duck typing
Perché Dart è eventualmente digitato, in realtà non hanno bisogno di utilizzare l'interfaccia, semplicemente scrivendo una classe che contiene la firma metodo corretto funziona (anche se gli strumenti non saranno in grado per convalidarlo).
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
Tutte le classi sono interfacce
Infine, tutte le classi sono anche le interfacce. Ciò significa che anche se un sistema di terze parti può essere stato scritto senza utilizzare le interfacce, è comunque possibile utilizzare una classe concreta come se fosse un'interfaccia.
Ad esempio, immaginiamo la seguente libreria impresa:
class EnterpriseDuck { // note: no implements keyword
void quack() {
// snip
}
}
sayQuack(EnterpriseDuck duck) { // takes an instance of the EnterpriseDuck class
duck.quack();
}
e si desidera passare un anatra finto nel metodo sayQuack in modo che il tipo di controllo può convalidare. È possibile creare il mockDuck per implementare l'interfaccia implicita EnterpriseDuck, semplicemente utilizzando l'EnterpriseDuck come interfaccia:
class MockDuck implements EnterpriseDuck {
void quack() => "I'm a mock enterprise duck";
}
ereditarietà multipla
In termini di ereditarietà multipla, questo non è possibile a Dart. È possibile, tuttavia, implementare interfacce multiple e fornire le proprie implementazioni dei metodi richiesti, ad esempio:
class MultiDuck implements Quackable, EnterpriseDuck, Swimable {
// snip...
}
interfacce possono avere classi di default
Come si utilizza Dart, troverete che la maggior parte delle classi" "sono in realtà interfacce. Elenco, stringa ecc. Sono tutte le interfacce con le implementazioni predefinite fornite. Quando si chiama
List myList = new List();
in realtà si sta utilizzando un'interfaccia List, e la nuova parola chiave reindirizza dall'interfaccia a un'implementazione lista predefinita sottostante.
Per quanto riguarda lo sviluppo in team
interfacce sono utili nel team di sviluppo, anche nel mondo open source. L'interfaccia definisce i metodi e le proprietà che dovresti costruire in modo che il tuo componente funzioni con il mio componente. È possibile creare la propria implementazione di test di tale interfaccia e io posso costruire la mia implementazione concreta di tale interfaccia e, quando avremo finito, possiamo integrarci. Senza l'interfaccia condivisa pubblicata, avrei bisogno di fornire la mia implementazione concreta prima che potessi davvero iniziare.
Spero che questo aiuti!
Grazie davvero Chris, era esattamente ciò di cui avevo bisogno. Inoltre, i nomi delle classi negli esempi sono adorabili. – snitko
nel pensare tu intendi, due dei tuoi commenti sul codice: "// nota: nessuna parola chiave dell'interfaccia" anziché "// nota: nessuna parola chiave implements". – GameAlchemist
Considerare l'aggiornamento di questo o aggiungere un commento a questo post spiegando che la parola chiave dell'interfaccia non viene più utilizzata in Dart. –