ho visto il modello implementato in modi diversi, ma l'idea è semplice:
- Hai qualche classe - l'interfaccia - che specifica semplicemente i nomi di alcune funzioni. (Si potrebbe desiderare di avere una classe chiamata Interfaccia che le vostre interfacce reali istanziano, solo così le vostre interfacce sono di tipo Interfaccia)
- Avete quindi qualche altra classe che implementa tale interfaccia. Ciò significa che questa seconda classe deve avere almeno tutte le funzioni specificate dall'interfaccia.
- Infine, avete qualche altra funzione da qualche altra parte, che si aspetta di ricevere un oggetto che implementa l'interfaccia. Nel codice di esempio che hai citato, questa funzione è addForm, che si aspetta un oggetto che implementa le interfacce "Composite" e "FormItem".
- Questa funzione esegue quindi il ciclo di tutti i metodi delle interfacce che si aspetta e verifica che anche l'oggetto a cui è passato abbia quei metodi. Se un metodo da una delle interfacce non viene trovato nell'oggetto passato alla funzione, determina che l'oggetto non implementa l'interfaccia e genera un'eccezione.
Alcune persone possono trovare questo modello non pratico a causa del sovraccarico, ma data la mancanza di supporto nativo per le interfacce di Javascript, questa soluzione non è male. Alcune persone potrebbero anche scoprire che l'uso di interfacce per piccoli progetti in Javascript è eccessivo.
Esempio
var Interface = function(name, methods) {
this.name = name;
this.methods = [];
if (methods.constructor == Array)
this.methods = methods;
else if (methods.constructor == String)
this.methods[0] = methods;
else
throw new Error("Interface must define methods as a String or an Array of Strings");
};
var InterfaceHelper = {
ensureImplements : function(obj, interfaces) {
// If interfaces is not an array, assume it's a function pointer
var toImplement = interfaces.constructor == Array ? interfaces : [interfaces];
var interface;
// For every interface that obj must implement:
for (var i = 0, len = toImplement.length; i < len; i++) {
interface = toImplement[i];
// Make sure it indeed is an interface
if (interface.constructor != Interface)
throw new Error("Object trying to implement a non-interface. "
+ interface.name + " is not an Interface.");
// Make sure obj has all of the methods described in the interface
for (var j = 0, interfaceLen = interface.methods.length; j < interfaceLen; j++)
if (!obj[interface.methods[j]])
throw new Error("Interface method not implemented. "
+ interface.name + " defines method " + interface.methods[j]);
}
return true;
}
};
var Drawable = new Interface("Drawable", ["onDraw"]);
var Surface = function() {
this.implements = ["Drawable"];
this.onDraw = function() {
console.log("Surface Drawing");
};
};
Uso
var myDrawableSurface = new Surface();
// Returns true
InterfaceHelper.ensureImplements(myDrawableSurface, Drawable);
// Returns false (Error thrown)
InterfaceHelper.ensureImplements(myDrawableSurface, Array);
fonte
2012-11-01 14:30:11
Che cosa ti confonde? Potresti ottenere una risposta migliore ponendo una domanda più specifica. –
Mi risulta difficile trovare una implementazione pratica di questo, principalmente come usarlo. Sto solo cercando un codice che implementa questo modello. Grazie per aver esaminato questa query !! –
@AnmolSaraf Ho aggiunto l'implementazione es6 dello stesso codice, fare riferimento ad esso. La sintassi è più semplice da capire se sei di origine OOP. –