【问题标题】:AS3 using base class object to create instance of extended classAS3 使用基类对象创建扩展类的实例
【发布时间】:2012-10-29 12:17:42
【问题描述】:

我有一个扩展 MovieClip 的自定义类。这个想法是它允许存储有关MovieClip 的额外变量和信息。

public class MapObject extends MovieClip
{
    private var cellX:int;
    private var cellY:int;

    public function MapObject()
    {
    }
 }

我有几个在运行时加载的MovieClips(.swf 文件)。问题是,我怎样才能让这些 MovieClip 对象真正成为 MapObject 对象?

我试过了:

var mapObject:MapObject = myMovieClip as MapObject;

但它给了null

附言。我知道您可以将变量动态添加到 MovieClip,但我并不想这样做。

【问题讨论】:

    标签: actionscript-3 actionscript


    【解决方案1】:

    您无法在不更改代码的情况下更改类层次结构。您必须进入每个类定义才能将父类更改为 MapObject 而不是 MovieClip。

    有一个简单而干净的解决方案是使用装饰器:

    public class MapObject {
    
        private var mc:MovieClip;
        private var cellX:int;
        private var cellY:int;
    
        public class MapObject(mc:MovieClip) {
            this.mc = mc;
        }
    
        public function get movieClip():MovieClip {
            return mc;
        }
    }
    ...
    
    var wrapper:MapObject = new MapObject(new MyMovieClip());
    ...
    
    container.addChild(wrapper.movieClip);
    

    它是一个包装器,它采用另一个类的实例(在您的情况下为 MovieClip)来添加功能。它非常强大,因为您不必每次更改 MapObject 时都去更改每个子类。这个原理叫做composition over inheritance。

    在您的情况下,MovieClip 的所有方法和属性都是公开的,因此您只需编写 mc.play() 而不是 this.play()。

    请参阅details about the Decorator design pattern。

    【讨论】:

    • 但是,您无法通过查看舞台上的实例来获得对包装器中信息的引用。因此,另一种解决方案是让 mc 使用实现接口的基类,该接口具有指向具有 cellX 和 cellY 的单独对象的属性,或者使用字典根据影片剪辑查找包装器。
    • 是的,我明白你的意思。有您的解决方案或存储所有包装器 - 尽管它可能会变得低效,因为它有点重复显示列表的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多