0

sagen, dass ich eine abstrakte Klasse zuWie erweitern Sie eine abstrakte Klasse in Javascript und kommentieren für den Abschluss Compiler, aber ohne Schließung Bibliothek?

/**@constructor 
* @abstract*/ 
function AbsFoo(){} 

/**@return {number} 
* @param {number} a 
* @param {number} b */ 
AbsFoo.prototype.aPlusB = function(a,b){ 
    return a + b 
}; 

/**@abstract 
* @return {number} 
* @param {number} c 
* @param {number} d */ 
AbsFoo.prototype.cMinusD = function(c,d){}; //extending class need to implement. 

und ich möchte diese Klasse erweitern, normalerweise würde ich etwas tun, wie

/**@constructor 
* @extends {AbsFoo} */ 
function Foo(){ 
    AbsFoo.apply(this); 
} 

Foo.prototype = new AbsFoo(); 
Foo.prototype.constructor = Foo; 

Foo.prototype.doSomething = function(c,d){ 
    return c - d; 
}; 

Aber Schließung Compiler sagt

JSC_INSTANTIATE_ABSTRACT_CLASS: cannot instantiate abstract class 

refering haben die Linie Foo.prototype = new AbsFoo();

So wie wir Würde ich das auf eine Art und Weise tun, die die Prototyp-Vererbung und die Fähigkeit, instanceof den ganzen Weg entlang der Klassenkette zu verwenden, sondern auch den Compiler glücklich machen würde?

Antwort

0

Ich benutze goog.inherits in dieser Situation. Da Sie die Schließbibliothek nicht verwenden möchten, können Sie einfach goog.inherits von closure-library/closure/goog/base.js kopieren. Vielleicht geben Sie ihm den Namen googInherits. Der Code ist dann etwa so:

+0

Wenn Sie den Code für goog.inherits betrachten, mache ich bereits das meiste, was diese Funktion tut. – Julian

+0

eigentlich ..... das funktioniert. Ich meine, ich habe es ein bisschen anders gemacht, aber es ist im Wesentlichen das Gleiche. Aber es scheint nur zu funktionieren, weil die Funktion goog.inherits eine neue Klasse erzeugt, eine abstrakte Klasse, die wie eine Brücke zwischen der Eltern- und der Kindklasse ist. Die Bridge-Klasse ist eine abstrakte Klasse, aber nicht als solche annotiert. Daher gibt der Compiler beim Erstellen einer Instanz für den untergeordneten Prototyp keine Warnung aus .... .... Ich habe das Gefühl, dass die @abstract-Annotation noch nicht vorhanden ist in einem stabilen Zustand. Ich bin mir ziemlich sicher, dass es ziemlich neu ist ... was auch immer, danke für die Antwort! – Julian

+0

Sie haben Recht, dass Closure Compiler kürzlich die Behandlung abstrakter Klassen aktualisiert hat. Meiner Erfahrung nach ist es konsequenter, Probleme mit abstrakten Klassen zu finden, auf die Sie stoßen. – owler

Verwandte Themen