2010-01-11 51 views
8

Tôi gặp sự cố xấu. Tôi có hai biến string (className và staticMethod) lưu trữ tên của một lớp và đó là phương pháp tĩnh Tôi phải gọi:AS3: gọi phương thức lớp tĩnh - tên lớp và phương thức là các chuỗi

package { 
import flash.display.Sprite; 
import flash.utils.getDefinitionByName; 
import flash.utils.getQualifiedClassName; 

public class ClassPlay extends Sprite { 

    public function ClassPlay() { 
    new Foo(); 
    var className:String = 'Foo'; 
    var staticMethod:String = 'bar'; 
    var classClass:Class = getDefinitionByName(className) as Class; 
    try { 
    classClass[staticMethod](); 
    } catch (e:Error) {} 
    } 
} 
} 

Đây là lớp subject:

package { 
public class Foo { 
    public static function bar():void {trace('Foo.bar() was called.');} 
} 
} 

Nó hoạt động giống một cách hoàn hảo. Các vấn đề khi bạn nhận xét ra này (9) dòng:

// new Foo(); 

Nếu không có dòng này nó thoát với một ngoại lệ:

ReferenceError: Error #1065: Variable Foo is not defined. 

Làm thế nào tôi có thể làm điều này mà không instantiation đó? Nếu điều đó là không thể, có cách nào để khởi tạo lớp từ biến chuỗi không? Hoặc nếu nó vẫn còn là một thực tế xấu, làm thế nào bạn sẽ làm điều đó? (Tôi phải làm việc với hai biến chuỗi không xác định đó.)

Xin cảm ơn trước.

Trả lời

8

Lý do là trình biên dịch sẽ loại bỏ các lớp không cần thiết - nếu bạn không có tham chiếu rõ ràng đến lớp Foo ở đâu đó, nó sẽ không có trong ứng dụng cuối cùng của bạn.

Bạn có thể tham khảo ở nơi khác và vẫn buộc nó phải được tải - ví dụ, một mảng tĩnh tham chiếu đến các lớp.

+2

Đây cũng là một vấn đề phổ biến khi sử dụng tiêm phụ thuộc trong as3. Đối với các tùy chọn khác, hãy xem http://www.springactionscript.org/docs/reference/html/Class-inclusion.html (lưu ý: trang web hiện đã ngừng hoạt động, nhưng phải trở lại sau cùng). –

+0

Cảm ơn bạn đã liên kết;) Trang web lại hoạt động trở lại. – itarato

0

Nó sẽ hoạt động nếu bạn chỉ cần ném một dấu vết (classClass) - mà sẽ cung cấp cho bạn tham khảo bạn cần, nếu tôi nhớ công cụ này một cách chính xác.

+0

Tôi không nghĩ rằng bạn thậm chí cần phải đi xa đến vậy. Tôi tin rằng nếu bạn chỉ cần đặt tên lớp trong mã của bạn (khác với trong một tuyên bố nhập khẩu) nó sẽ được bao gồm. Các complier là khá câm. ví dụ: Sprite; MyClass; –

+0

Không, nó không hoạt động. Đã xảy ra lỗi khi classClass khởi tạo. – itarato

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