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?
Wenn Sie den Code für goog.inherits betrachten, mache ich bereits das meiste, was diese Funktion tut. – Julian
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
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