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.
fonte
2013-08-13 23:45:59
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
Potrei sbagliarmi, ma secondo la documentazione (haxe 3.2.0) è 'Type.createInstance (myClassRef, [args]);' Cioè, nessun 'costruttore 'nei parametri. – chichilatte
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 –