2013-08-13 57 views
7

Tôi đang cố chuyển một tham chiếu Lớp và khởi tạo nó trong một hàm. Điều này không hoạt động:Truyền Lớp như tham số

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

Nó cung cấp Unexpected (.

Điều này có thể thực hiện được trong Haxe 3 không?

Trả lời

11

ClassType Parameter, vì vậy nếu bạn đang đi để chấp nhận một lớp học như một cuộc tranh cãi, bạn cần phải xác định một tham số kiểu.

Chấp nhận bất kỳ lớp:

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

Chấp nhận chỉ "sys.db.Object" lớp hoặc các lớp học phụ:

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

haXe 3 cũng cho phép generic functions:

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

đây bạn khai báo hàm là generic, có nghĩa là đối với mỗi tham số kiểu khác nhau, một versi khác trên của hàm sẽ được biên dịch. Bạn chấp nhận Class, trong đó T là tham số kiểu - trong trường hợp này là dynamic, do đó nó sẽ làm việc với bất kỳ lớp nào. Cuối cùng, sử dụng các hàm chung cho phép bạn viết new T(), có thể có vẻ là cú pháp tự nhiên hơn và có thể có lợi ích hiệu suất trên một số nền tảng.

+0

Tôi chỉ muốn thêm, rằng với Dead Code Elimination được đặt thành đầy đủ (-dce full), hàm tạo của lớp sẽ bị loại bỏ nếu nó không được sử dụng ở bất kỳ nơi nào khác. Để khắc phục điều này, chúng tôi sẽ thêm chữ ký của hàm tạo bằng @: giữ siêu dữ liệu, [như thế này] (https://github.com/HaxeFoundation/haxe/issues/1891). – Veehmot

+0

Tôi có thể sai, nhưng theo tài liệu (haxe 3.2.0) đó là 'Type.createInstance (myClassRef, [args]);' Đó là, không có 'constructor' trong params. – chichilatte

+0

Đó chỉ là tôi đang viết để cố gắng viết một câu. Tôi cũng có thể viết 'Type.createInstance (myClassRef, [arg1, arg2, arg3])'. Xin lỗi vì sự nhầm lẫn, tôi sẽ chỉnh sửa câu trả lời –

4

Có thể trong Haxe3 và Haxe2

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

}

Lưu ý: Haxe3 lớp (nơi foo được thực hiện) phải @: generic nếu bạn muốn mới T() để làm việc.

Haxe2 là một câu chuyện khác:

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

}

Các vấn đề liên quan