2013-08-13 19 views
7

Sto provando a passare un riferimento di classe e creare un'istanza in una funzione. Questo non funziona:Pass Class come parametro

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

Fornisce Unexpected (.

È possibile in Haxe 3?

risposta

11

Class ha un Type Parameter, quindi se avete intenzione di accettare una classe come argomento, è necessario specificare un parametro di tipo.

Accetta qualsiasi classe:

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

accettare solo classe "sys.db.Object" o le sottoclassi:

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

Haxe 3 consente anche generic functions:

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

Qui dichiari che la funzione è generica, il che significa che per ogni parametro di tipo diverso, un versetto diverso sulla funzione verrà compilato. Accetti Class, dove T è il parametro type, in questo caso dinamico, quindi funzionerà con qualsiasi classe. Infine, usando le funzioni generiche, scriviamo new T(), che può sembrare una sintassi più naturale, e su alcune piattaforme potrebbero esserci dei vantaggi in termini di prestazioni.

+0

Voglio solo aggiungere che, con Dead Code Elimination impostato su full (-dce pieno), il costruttore della classe verrebbe eliminato se non fosse utilizzato altrove. Per risolvere questo problema, dovremmo anteporre la firma del costruttore con @: mantenere i metadati, [come questo] (https://github.com/HaxeFoundation/haxe/issues/1891). – Veehmot

+0

Potrei sbagliarmi, ma secondo la documentazione (haxe 3.2.0) è 'Type.createInstance (myClassRef, [args]);' Cioè, nessun 'costruttore 'nei parametri. – chichilatte

+0

Ero solo io a scrivere cercando di scrivere una frase. Potrei anche aver scritto 'Type.createInstance (myClassRef, [arg1, arg2, arg3])'. Scusa per la confusione, modifico la risposta –

4

E 'possibile in Haxe3 e Haxe2

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

}

Nota: classe Haxe3 (dove è implementato foo) deve essere @: generica, se si desidera nuovo T() al lavoro.

Haxe2 è un'altra storia:

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

}