2013-08-13 37 views
7

Ich versuche, eine Klassenreferenz zu übergeben und in einer Funktion instanziieren. Dies funktioniert nicht:Klasse als Parameter übergeben

function foo(myClassRef:Class):Void { 
    var myVar = new myClassRef(); 
} 
foo(MyClass); 

Es gibt Unexpected (.

Ist das in Haxe 3 möglich?

Antwort

11

Class hat eine Type Parameter, also, wenn Sie eine Klasse als Argument akzeptieren, gehen, müssen Sie einen Typ-Parameter angeben.

Accept jede Klasse:

function foo(myClassRef:Class<Dynamic>):Void { 
    var myVar = Type.createInstance(myClassRef, [constructorArg1, constructorArg2....]); 
    trace(Type.typeof(myVar)); 
} 

Akzeptieren nur "sys.db.Object" Klasse oder Unterklassen:

function foo(myClassRef:Class<sys.db.Object>):Void { 
    var myVar = Type.createInstance(myClassRef, []); 
    trace(Type.typeof(myVar)); 
} 

Haxe 3 ermöglicht auch generic functions:

@:generic function foo<T:Dynamic>(t:Class<T>) { 
    var myVar = new T(); 
    trace(Type.typeof(myVar)); 
} 

Hier Sie deklarieren die Funktion als generisch, was bedeutet, dass für jeden anderen Typparameter eine andere Version existiert Ein der Funktion wird kompiliert. Du akzeptierst Klasse, wobei T der Typparameter ist - in diesem Fall dynamisch, also wird es mit jeder Klasse funktionieren. Schließlich können Sie mit generischen Funktionen new T() schreiben, was eine natürlichere Syntax zu sein scheint, und auf einigen Plattformen kann es Leistungsvorteile geben.

+0

Ich möchte nur hinzufügen, dass mit Eliminierung von Dead Code auf voll (-dce voll) der Konstruktor der Klasse eliminiert werden würde, wenn es nirgendwo sonst verwendet wird. Um dies zu beheben, sollten wir die Konstruktorsignatur mit @ voranstellen: Metadaten beibehalten, [wie folgt] (https://github.com/HaxeFoundation/haxe/issues/1891). – Veehmot

+0

Ich kann falsch liegen, aber laut der Dokumentation (haxe 3.2.0) ist es 'Type.createInstance (myClassRef, [args]);' Das heißt, kein 'Konstruktor' in den Parametern. – chichilatte

+0

Das war nur ich schreibe versucht einen Satz zu schreiben. Ich hätte auch 'Type.createInstance (myClassRef, [arg1, arg2, arg3])' 'schreiben können. Entschuldigung für die Verwirrung, ich werde die Antwort bearbeiten –

4

Es ist möglich, in Haxe3 und Haxe2

function foo<T>(myClassRef:T):Void { 
var myVar = new T(); 

}

Hinweis: Haxe3 Klasse (wo foo implementiert ist) müssen @: generic wenn Sie wollen neue T() zu arbeiten.

Haxe2 ist eine andere Geschichte:

function foo<T>(myClassRef:Class<T>):Void { 
var myVar = Type.createEmptyInstance(Type.getClass(myClassRef)); 

}

Verwandte Themen