我一直在编写一个系统,在运行时生成一些模板,然后根据这些模板生成一些对象。我认为模板可能是Class类的扩展,但这导致了一些很大的错误:
VerifyError: Error #1107: The ABC data is corrupt, attempt to read out of bounds.
我想知道的是,如果有可能继承Class的子类,如果有可能在某些情况下这样做是合适的,而不仅仅是对OOP的严重滥用。我相信它应该是可能的,因为ActionScript允许您创建Class类型的变量。这个用法在LiveDocs entry for Class中有描述,但我没有看到过对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子类的实例的实例是什么类型的?
答案 0 :(得分:5)
从第一段中的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 .....
}
}
一个类可以实现多个接口,而它可以只扩展一个类。
但是,如果您希望在模板类中提供任何实现,那么您最好只创建一个与其子类具有任何共性的类,并且只使用普通的旧继承。
希望这有帮助。
答案 1 :(得分:1)