Tôi có thể tạo một thể hiện của một lớp từ AS3 chỉ biết tên của nó không? Ý tôi là đại diện chuỗi, như FlagFrance
Tôi có thể tạo một thể hiện của một lớp từ AS3 chỉ biết tên của anh ấy không?
Trả lời
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.
Có, sử dụng getDefinitionByName
:
import flash.utils.getDefinitionByName;
var FlagFranceClass:Class = getDefinitionByName("FlagFrance");
var o:* = new FlagFranceClass();
- 1. Làm thế nào tôi có thể khởi tạo một đối tượng chỉ biết tên của nó?
- 2. AS3 - Tôi có thể biết nếu một lớp thực hiện một giao diện (hoặc là một lớp con của một lớp khác)?
- 3. Haxe - tạo một thể hiện của một lớp từ một tên chuỗi
- 4. Tôi có thể khởi tạo một lớp ẩn danh trong hàm tạo của lớp ngoài không?
- 5. Địa chỉ của người gửi thư Java được hiển thị thay vì tên của anh ấy
- 6. Bạn có thể đặt tên một thể hiện giống với tên hàm tạo của nó không?
- 7. Có thể tạo một thể hiện của một lớp mà không cần chạy bất kỳ mã nào từ lớp không? (không có ctor, không có khởi tạo trường)
- 8. Việc tạo một thể hiện của một lớp con có tự động tạo đối tượng siêu lớp của nó không?
- 9. Tạo một thể hiện của một lớp với()
- 10. Không thể tạo chuỗi một thể hiện của một lớp trong Haskell
- 11. PHP có thể khởi tạo một đối tượng từ tên của lớp dưới dạng chuỗi không?
- 12. Lấy tên của lớp từ một cá thể
- 13. Tôi có thể tự động chuyển đổi một thể hiện của một lớp này sang một lớp khác không?
- 14. Lớp python có thể trả về một thể hiện mới của lớp của nó không?
- 15. Tạo một đối tượng chỉ biết tên lớp?
- 16. Có thể biết đường dẫn của tệp của một phân lớp trong python không?
- 17. Tạo thuộc tính thể hiện của lớp từ một từ điển?
- 18. Chúng ta có thể tạo một thể hiện của một giao diện trong Java không?
- 19. Khởi tạo một lớp mới từ tên của một biến trong một không gian tên
- 20. Tạo một Nút chỉ có mã AS3
- 21. Tôi có thể tạo một hàm tạo để deserializes một phiên bản chuỗi của đối tượng của tôi không?
- 22. Tôi có thể nhận được kích thước của một trường struct w/o tạo một thể hiện của cấu trúc?
- 23. Có thể một thành viên của một lớp được đặt tên giống với tên của nó (lớp khác) không?
- 24. Có thể lấy tên của lớp hiện tại từ một đối tượng không được khôi phục trong PHP?
- 25. Một thể hiện của một lớp có thay thế chính nó bằng JavaScript không?
- 26. Khởi tạo một lớp từ tên văn bản của nó
- 27. Tôi có thể tạo một UITableViewController kế thừa từ một lớp con tùy chỉnh của UIViewController không?
- 28. Làm thế nào một thể hiện của lớp cơ sở giữ một thể hiện của lớp dẫn xuất?
- 29. AS3 - Làm thế nào tôi có thể nhận được một mảng các hằng số của một lớp?
- 30. Có thể tạo một lớp Repository chung cho tất cả các đối tượng của tôi không?
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. –
@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