2015-09-08 9 views
7

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?

+2

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). –

+0

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

+0

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

Antwort

5

Der folgende Code wird das tun, was Sie wollen, obwohl es derzeit nur in FF 41+ und 47+ Chrome unterstützt wird (siehe https://kangax.github.io/compat-table/es6/)

class Bot{ 
    constructor(){ 
     if (new.target === Bot) 
      this.render(); 
    } 
    render(){ 
     console.log('Bot rendered'); 
    } 
} 

class DevilBot extends Bot{ 
    constructor(){ 
     super(); 
     this.color = 0xB4D333; 
     this.render(); 
    } 
    render(){ 
     console.log('DevilBot rendered with', this.color); 
    } 
} 

var bot = new Bot();  // Bot rendered 
var dev = new DevilBot(); // DevilBot rendered with 11850547 
Verwandte Themen