Flash 延长这门课合法吗?

Flash 延长这门课合法吗?,flash,actionscript-3,oop,metaprogramming,Flash,Actionscript 3,Oop,Metaprogramming,我一直在编写一个系统,该系统在运行时生成一些模板,然后基于这些模板生成一些对象。我认为模板可以是类的扩展,但这导致了一些重大错误: VerifyError: Error #1107: The ABC data is corrupt, attempt to read out of bounds. 我想知道的是,类的子类化是否可能,在某些情况下这样做是否合适,而不仅仅是对OOP的严重误用。我相信这应该是可能的,因为ActionScript允许您创建类类型的变量。这个用法在中有描述,但是我没有看到提

我一直在编写一个系统,该系统在运行时生成一些模板,然后基于这些模板生成一些对象。我认为模板可以是类的扩展,但这导致了一些重大错误:

VerifyError: Error #1107: The ABC data is corrupt, attempt to read out of bounds.
我想知道的是,类的子类化是否可能,在某些情况下这样做是否合适,而不仅仅是对OOP的严重误用。我相信这应该是可能的,因为ActionScript允许您创建类类型的变量。这个用法在中有描述,但是我没有看到提到子类化类

下面是一个伪代码示例:

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=newa(),即使
A
在运行时之前不存在?我已经读到这是不可能的,因为
A
不是静态可解析的,但是我正在做我自己的测试来探索这种可能性

最终,目的是在运行时生成新类,然后创建这些类的实例


总而言之:你能给这个类划分子类吗?如果是这样的话,您如何做到不出错,以及类子类的实例是什么类型的?

在第一段的livedoc中,它声明
每个类对象都是类的实例。
因此,扩展类是错误的,因为任何类对象都已经是类

你说的
系统生成一些模板,然后根据这些模板生成一些对象。
听起来你真正想做的是创建一个接口

当模板未提供任何实现时,应使用接口。也就是说,您声明了一组字段和方法,但没有提供这些方法的实现。 您将声明这样一个类,如下所示:

public interface Foo {
    function bar:void;
}
现在,要创建实现此接口的类,只需执行以下操作

public class MyClass implements Foo {
    function bar:void {
        ..... implementation goes here .....
    }
}
一个类可以实现多个接口,而它只能扩展一个类

然而,如果您想在模板类中提供任何实现,那么您最好只创建一个具有其子类所具有的任何共性的类,并且只使用普通的旧继承


希望这能有所帮助。

以下是我自己深入研究的结果:

扩展类在本质上似乎是不可能的,尽管在我所见过的任何地方都没有很好的文档记录。根据我的调查,我现在确信类本身并不包括其他顶级类所具有的所有特性,即使它们都是从对象类扩展而来的

更令人沮丧的是,子类化不同的顶级类将导致几个不同的错误消息,这使我们很难判断到底是什么问题在起作用。从一个简单的示例开始,如果您试图对ActionScript的许多基本数据类型(int、uint、Number、String、Boolean等)进行子类化,则会出现以下编译器错误:

这是有道理的,因为查看这些类的文档可以发现它们确实是最终的:

Package       Top Level
Class         public final class Boolean
Inheritance   Boolean -> Object
当然,final关键字意味着另一个类不能扩展标记为final的类。现在来看一个更复杂的例子,让我们看看Function类的扩展。根据文档,函数类不是最终的。因为它不是最终的,这是否意味着我们可以扩展函数类来创建我们自己的专用函数对象?以下是一个定义:

class MyFunction extends Function { /*...*/ }
// the definition causes no errors on its own, even though the compiler "sees" it
class MyClass extends Class { /*...*/ }

/* elsewhere */

MyClass; // the only mention of MyClass beyond the definition
。。然后在运行时:

将此与上面的原始数据类型错误进行比较。该错误发生在编译时,因为继承的原语类实际上被标记为final。函数类未标记为final,但该类的行为仍与final类似,只是在运行时

现在,我们来讨论主要问题:扩展类。与函数类一样,类不是最终的。此外,类是动态的,这意味着可以在运行时向类对象添加新属性

有趣的是:Function类也是动态的,我相信这一部分允许继续支持ECMAscript方言中存在的旧原型继承机制。在这种方言中,函数被用作某种类型的类(好吧,原型),函数在运行时添加属性的能力是原型继承能力的一部分

现在,我的理解是,类对象的属性与该类的任何实例可用的静态属性相同。因此,有人可能希望在运行时操作类对象,从而允许他们更改该类及其实例的行为,这在逻辑上应该是合理的。类是动态的这一点强化了这一概念

由于类不是最终的,我很好奇是否可以扩展类,以创建自己的类模型专门化,并在元语言领域的某个地方工作。我将留到另一天讨论为什么会有人想这样做,以及它假设允许的权力。现在,让我们来扩展这个类,作为结束示例。这里有一个定义:

class MyFunction extends Function { /*...*/ }
// the definition causes no errors on its own, even though the compiler "sees" it
class MyClass extends Class { /*...*/ }

/* elsewhere */

MyClass; // the only mention of MyClass beyond the definition
。。然后在运行时:

天哪!
VerifyError
是为格式错误的SWF数据保留的。根据我所能找到的,这也是Flash播放器中的“bug”如何表现出来的。在这两种情况下,这都稍微超出了普通ActionScript错误的范围

在这一点上,很难理解到底发生了什么,但这就是我迄今为止所能推断的

VerifyError: Error #1107: The ABC data is corrupt, attempt to read out of bounds.
我(错误地,见下面的注释)认为“ABC”代表抽象基类,它
VerifyError: Error #1107: The ABC data is corrupt, attempt to read out of bounds.