2017-07-23 1 views
2

Gibt es einen Compiler Meta für Class-Deklaration, dass verhindert, Klasseninstanz zu erstellen, bevor es erweitert? Mit anderen Worten - eine Art Gegenteil von @:final Meta.Mark Haxe Class for forced extend?

Wie so (letzte Zeile Code):

class A { 
    // ... 
} 

class B extends A { 
    // ... 
} 

// ... 
var b = new B(); // OK 
var a = new A(); // induce compiler-error 

Antwort

1

Eine Möglichkeit, dies zu erreichen, ist private Klasse Konstruktor zu erstellen:

class A { 
    private function new() { 
     // ... 
    } 
} 

// ... 
var a = new A(); // Error: Cannot access private constructor 
6

einfach nicht erklären, einen Konstruktor überhaupt für die Klasse A

1

Beide anderen Antworten sind korrekt (kein Konstruktor oder privater Konstruktor), aber es gibt noch ein paar weitere Details, die Sie interessieren könnten:

  • Hier ist an example von keinem Konstruktor. Bemerkenswert ist, dass A einfach keinen Konstruktor hat und B einfach super() nicht aufruft. Ansonsten funktioniert alles anders als erwartet.
  • Hier ist an example eines privaten Konstruktors. Sie können immer noch keine new A() instanziieren, aber Sie müssen immer noch super() von B Konstruktor aufrufen.

Technicalities:

  • Verwendung einiger Funktionen (wie ein Standardwert auf einer Membervariable) wird A verursacht einen impliziten Konstruktor zu bekommen, automatisch. Mach dir keine Sorgen, dies hat keinen Einfluss auf die Konstruierbarkeit oder ob Sie super() anrufen müssen. Aber wissen Sie, dass es da ist, und falls notwendig, wird ein impliziter super() Aufruf dem B Konstruktor vorangestellt. Sehen Sie sich die JS-Ausgabe an, um dies zu überprüfen.
  • In jedem Fall, wissen Sie, dass Sie noch eine A zur Laufzeit mit var a = Type.createInstance(A,[]); instanziieren können, da die Überprüfung der Kompilierungszeit nicht RTTI begrenzen.

Verwandte Diskussion:

Abgesehen von privat/kein Konstruktor hat Haxe keinen formalen Begriff der abstrakter Klassen hat (Basisklassen nicht instanziiert werden erwartet) oder abstrakte Methoden (Funktionen auf abstrakte Basisklassen ohne Implementierung, die muss durch eine abgeleitete Klasse implementiert werden.) Allerdings , Andy Li schrieb a macro für die Durchsetzung einiger dieser Konzepte, wenn Sie sie verwenden. Ein solches Makro kann Verstöße gegen diese Regeln erkennen und Kompilierungsfehler auslösen.


1. Nicht ein ganz anderes Thema mit Haxe abstracts types, bei denen es verwechselt werden.

2. Nicht, mit virtuellen Funktionen zu verwechseln, die wikipedia describes als eine Funktion, die kann außer Kraft gesetzt werden (obwohl verschiedene Dokumente für verschiedene Sprachen beschreiben diese hochbelasteter Begriff unterschiedlich.)