我一直在编写一个系统,在运行时生成一些模板,然后根据这些模板生成一些对象.我有一个想法,模板可能是Class类的扩展,但这导致了一些宏伟的错误:
VerifyError: Error #1107: The ABC data is corrupt, attempt to read out of bounds.
我想知道的是,如果子类化Class甚至可能,如果有可能在某些情况下这样做是合适的,而不仅仅是对OOP的严重滥用.我相信它应该是可能的,因为ActionScript允许您创建Class类型的变量.这个用法在Class的LiveDocs条目中描述,但我没有看到子类化Class的提及.
这是一个伪代码示例:
class Foo extends Class var A:Foo = new Foo(); // A is a class trace(A is Class); // true, right? var b = new A(); // b is an instance of class A
我不知道b
会是什么类型.会这样吗?
trace(b is A); // true?
但后来,你能输入变量b
输入A
,如var b:A = new A();
,即使A
不存在,直到运行?我已经读过,这是不可能的,因为A
不是静态可解析的,但我正在进行自己的测试来探索这种可能性.
最终,目的是在运行时生成新类,然后创建这些类的实例.
总结:你可以继承Class类吗?如果是这样,你怎么能没有错误地做到这一点,以及Class子类实例的实例是什么类型的?
从第一段中的livedoc开始,它声明Every Class object is an instance of the Class class.
,因为任何类对象已经是一个类,所以扩展Class会是一个错误.
你说a system that generates some templates, and then generates some objects based on those templates.
这听起来像你真正想做的是创建一个界面.
当您的模板未提供任何实现时,应使用接口.也就是说,您声明了一堆字段和方法,但没有提供方法的实现.您可以按如下方式声明这样的类:
public interface Foo { function bar:void; }
现在创建一个实现此接口的类,您只需执行以下操作.
public class MyClass implements Foo { function bar:void { ..... implementation goes here ..... } }
类可以实现多个接口,而它可以只扩展一个类.
但是,如果您希望在模板类中提供任何实现,那么您最好只创建一个与其子类具有任何共性的类,并且只使用普通的旧继承.
希望这可以帮助.