2011-09-29 29 views

Trả lời

24

Tạo các trường hợp của các lớp động theo tên. Để làm đoạn mã sau đây có thể được sử dụng:

//cc() is called upon creationComplete 
    private var forCompiler:FlagFrance; //REQUIRED! (but otherwise not used) 

    private function cc():void 
    { 
     var obj:Object = createInstance("flash.display.Sprite"); 
    } 

    public function createInstance(className:String):Object 
    { 
     var myClass:Class = getDefinitionByName(className) as Class; 
     var instance:Object = new myClass(); 
     return instance; 
    } 

Các tài liệu cho getDefinitionByName nói:

"Returns a reference to the class object of the class specified by the name parameter." 

Đoạn mã trên chúng ta cần phải xác định giá trị trả về là một Class? Điều này là do getDefinitionByName cũng có thể trả về một hàm (ví dụ: flash.utils.getTimer - một hàm cấp gói không có trong bất kỳ lớp nào). Vì kiểu trả về có thể là một nhóm chức năng hoặc một nhóm Flex, chỉ định kiểu trả về là Object và bạn được mong đợi thực hiện một phép diễn khi cần thiết.

Đoạn mã trên bắt chước ví dụ được đưa ra trong tài liệu, nhưng theo một cách nào đó là một ví dụ xấu vì mọi thứ sẽ hoạt động tốt cho flash.display.Sprite, nhưng cố gắng làm điều tương tự với lớp tùy chỉnh và có thể bạn sẽ kết thúc với lỗi sau:

ReferenceError: Error #1065: Variable [name of your class] is not defined. 

Lý do lỗi là bạn phải tham chiếu đến lớp học trong mã của bạn - ví dụ: bạn cần phải tạo biến và chỉ định loại đó như sau:

private var forCompiler:SomeClass; 

Nếu không làm điều này, lớp học của bạn sẽ không được biên dịch vào .swf tại thời gian biên dịch. Trình biên dịch chỉ bao gồm các lớp thực sự được sử dụng (và không chỉ được nhập). Nó làm như vậy để tối ưu hóa kích thước của .swf. Vì vậy, cần phải khai báo một biến nên không thực sự được coi là một giám sát hoặc lỗi, mặc dù nó cảm thấy hackish để khai báo một biến mà bạn không trực tiếp sử dụng.

+0

Có thể sẽ rất khôn ngoan khi lưu lại kết quả của lệnh gọi getDefinitionByName. Tôi không biết nó chậm như thế nào, nhưng vì nó liên quan đến sự phản chiếu, nó có lẽ không phải là rất nhanh. –

+0

@Laurent yes, nếu bạn cần truy cập một lớp theo cách này nhiều lần, lưu trữ giá trị trả lại trong var của riêng bạn. Nhưng việc tạo một bộ nhớ cache chung cho các cuộc gọi getDifinitionByName có thể không phải là thông minh. Những lần tôi đã sử dụng tôi đã chỉ gọi nó một lần! Vì vậy, có kết quả được lưu trong bộ nhớ cache sẽ chỉ chiếm bộ nhớ. – RasmusWL

7

Có, sử dụng getDefinitionByName:

import flash.utils.getDefinitionByName; 

var FlagFranceClass:Class = getDefinitionByName("FlagFrance"); 
var o:* = new FlagFranceClass(); 
Các vấn đề liên quan