1

我有一个持有者影片剪辑,它的基类是 foo。

package {
    import flash.display.MovieClip;

    public class Foo extends MovieClip {
        public function Foo() {
            trace("foo");
        }
    }
}

在 foo 中还有许多其他的影片剪辑,它们的基类是 bar。

package {
    import flash.display.MovieClip;

    public class Bar extends MovieClip {
        public function Bar() {
            trace("bar");
        }
    }
}

我在 bar 的构造函数中放置了一个跟踪,以便我可以判断它是否被正确加载,当我将 foo 拖到场景中并运行剪辑时,其中的所有小条都会正确触发。但是,当我将它动态添加到场景中时,例如在 Main 类中:

package {
    import flash.display.MovieClip;

    public class Main extends MovieClip {
        public function Main() {
            this.addChild(new Foo());
        }
    }
}

突然, foo 中的所有小 bar 影片剪辑都恢复为常规的旧影片剪辑并且不会触发。有趣的是,如果您在某些时候将它们类型转换为 Bar,并且它们的普通类设置为 Bar(在影片剪辑本身内,而不是基类中),它会起作用并且构造函数都会触发,如下所示:

    public function Main() {
        var foo:Foo = new Foo();
        stage.addChild(foo);
        foo.x = 0;
        foo.y = 0;

        trace(foo.getChildAt(1) as Bar);
    }//Main()

但是,如果您需要多种不同类型的 Bar 剪辑,并为每个剪辑提供一个 Bar 基类,则此方法行不通。它们都作为通用影片剪辑生成。如果您通过并将它们类型转换为Bar1or Bar2,它确实有效,但这意味着在实践中,每次您将剪辑添加到舞台时,您都必须尝试将每个子对象类型转换为每个顶级对象类型。

您也不能拥有一堆相同类型的影片剪辑,因为 Flash 不允许这样做,因此每个影片剪辑都需要是一个新类,并在父级放在舞台上时对该类进行类型转换。有点违背 OOP 的目的。

这似乎是 Flash 本身的一个错误,但有什么办法可以修复它吗?

4

1 回答 1

1

问题在于您声明 Foo 的类成员。如果您希望 Flash 将元素实例化为除了 MovieClip 或 Sprite 之外的任何其他元素,则必须正确地向类添加成员声明,​​或者在使用new关键字时声明类型。

这有效:

package {
import flash.display.MovieClip;
import flash.utils.describeType;

public class Foo extends MovieClip {
    public var bar1:Bar1;
    public var bar2:Bar2;
    public var bar3:Bar1;
    public var bar4:Bar2;

    public function Foo() {
        trace("foo", this.numChildren);

    }
}
}

如果您的类没有真正做任何特别的事情,您也可以将 ActionScript 首选项设置为“自动声明舞台实例”并省略类声明。

ActionScript 对类型非常宽容,但编译器似乎会忽略面板中声明的类型,直到它在代码中找到某种引用,这可能是为了防止在有人忘记擦除库中某处的类名时意外膨胀二进制文件.

于 2010-12-20T01:09:15.580 回答