如何引用拥有另一个类的类的实例?

时间:2013-12-14 20:18:00

标签: actionscript-3 flash class

我有一个带有属性相机的Map类,它是另一个自定义类MapCamera。

MapCamera有五个属性:

_x

_y

map - 对拥有此MapCamera的Map实例的引用

OFFSETX

OFFSETY

我如何引用拥有此MapCamera的Map实例?

Map.as:

package  {

    import MapCamera;
    import flash.display.Sprite;

    public class Map extends Sprite {

        public var camera:MapCamera = new MapCamera(this);

        public function Map() {
            // constructor code
            }

    }

}

MapCamera.as:

package  {

    import Map;

    public class MapCamera {

        private var _x:Number;
        private var _y:Number;
        public var map:Map // a reference to the instance of Map owning this MapCamera
        public var offsetX:Number;
        public var offsetY:Number;

        public function get x():Number{ return _x; }
        public function get y():Number{ return _y; }

        public function set x(n:Number):void
        {
            _x = n;
            map.x = -(_x + offsetX);
        }

        public function set y(n:Number):void
        {
            _y = n;
        map.y = -(_y + offsetY);
        }

        public function MapCamera(m:Map) {
            // constructor code
            map = m;
        }

    }

}

但我收到此错误: Map.as,第8行,第47列1067:将类型Class的值隐式强制转换为不相关的类型Map。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您尝试在创建MAP时将实例化的MAP对象作为引用传递给MAPCAMERA类。

你的问题在于,当你打电话时

public var camera:MapCamera = new MapCamera(this);

您尚未实际创建该类的实例。 Actionscript将在运行构造函数之前创建类全局对象,以便在构造函数运行时可以使用所需的对象。

在这种情况下,您必须将代码移动到Map构造函数中,否则您只会将CLASS引用传递给您的相机,而不是它的实例。

public function MapCamera(m:Map)

函数调用不会给你一个错误,因为m作为一个类传递,无论你传递类或它的实例m:Map当然会接受它,因为它们都是有效的。尝试调试代码并查看当您尝试调用MapCamera构造函数时m看起来的样子(只需在那里设置断点)。差异将变得明显。

这样做当然是完全有效的,例如,如果你想动态创建现有类对象的实例并传递类而不是构造函数。

请改为:

public var camera:MapCamera;

public function Map()
{
        camera = new MapCamera(this);
}