扩展Class类是合法的吗?

时间:2010-04-10 18:02:56

标签: flash actionscript-3 oop metaprogramming

我一直在编写一个系统,在运行时生成一些模板,然后根据这些模板生成一些对象。我认为模板可能是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子类的实例的实例是什么类型的?

2 个答案:

答案 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)