ECMAScript 6 (Harmony) führt classes
mit der Fähigkeit ein, von einem anderen zu erben. Angenommen, ich habe ein Spiel und eine grundlegende Klasse, um grundlegende Dinge für das Bot-Verhalten zu beschreiben. Ich vereinfache meine echte Architektur, aber nehme an, dass ich render
und einige andere Routine ausführen muss, und ich setze diese Anrufe in grundlegende Bot
Klasse.Übergeordnete Konstruktoraufruffunktionen vor dem Abschluss aller untergeordneten Konstruktoren
Jeder Bot dann außer Kraft setzt es render
Funktion ist und einige Einstellungen im Konstruktor hat:
class DevilBot extends Bot{
constructor(){
super();
this.color = 0xB4D333;
}
render(){
createSomeMesh(this.color);
}
}
Das Problem hier ist, dass, bevor ich super()
nennen - this
existiert nicht. Aber super
(übergeordneter Konstruktor) wird das überschriebene render
aufrufen, das die color
Variable benötigt, die in dem Kindkonstruktor definiert wird. Ich kann in der übergeordneten Konstruktor annehmen, dass das untergeordnete Objekt etwas init
Funktion mit allen benötigten Einstellungen implementieren würde und nennen es:
class Bot{
constructor(){
if (this.init) this.init();
render();
}
render(){}
}
class DevilBot extends Bot{
init(){
this.color = 0xB4D333;
}
render(){
createSomeMesh(this.color);
}
}
Aber wie gut dieser Ansatz und was eine bevorzugte Art und Weise ist, ein solches Problem zu lösen?
Die einzige Lösung ist nicht nennen Methode in Konstruktor overridable. Wenn Sie es in C# tun, erhalten Sie eine [Warnung] (https://msdn.microsoft.com/en-us/library/ms182331.aspx). –
Dies ist ein Grund, warum Objekte einiger Typen oft einen Konstruktor und eine separate '.init()' Methode haben, weil die '.init()' Methode ausgeführt wird, nachdem das Objekt vollständig gebildet wurde und alle Überschreibungen vorhanden sind. – jfriend00
Die Lösung könnte so einfach sein, dass andere Funktionen (wie zum Beispiel 'render'), die von Instanzeigenschaften abhängen, nicht automatisch aufgerufen werden. Was ist der Schaden beim manuellen Aufruf von 'this.render()' nach dem Aufruf der 'Bot'-Subklassen? PS, um eine Memberfunktion innerhalb Ihrer Klasse aufzurufen, benötigen Sie 'this.render()' anstelle von 'render()'. – naomik