当对象重新转换为原始类型时,为什么不重置属性?

时间:2013-03-05 14:28:35

标签: actionscript-3

我试着在这里提出这个问题,但无法得到满意的答案。 (Why should compiler allow super-class of a parameter in a function) 试着再问一次。 在类上完成时,为什么要进行转换,不会松散成员函数?在下面,我预计,在转换为Sprite之后,该类应该丢失有关当前帧的所有信息。但是它保留了这些信息,好像演员只是一场“炫耀”,而不是“内部实际完成”?

import flash.display.MovieClip;
import flash.display.Sprite;

var mc:MovieClip 
mc.gotoAndStop(2);
trace(mc.currentFrame);  // output 2  --> that's ok 

var sprite:Sprite = Sprite(mc)

trace( MovieClip(sprite).currentFrame);//output 2, value not lost, which is questionable

输出: 2 2

我知道,答案可能是,Adobe就是这样做的。但是逻辑是什么?理想的逻辑应该是,在投射和重铸之后,所有值必须恢复到默认值。 (在这种情况下为'0')

2 个答案:

答案 0 :(得分:2)

Cast不会清除成员字段。演员表明其他人可以访问的内容 从这个对象但不改变对象。

在flash中,对象通过引用传递。想象一下你在内存中有一个对象(在你的情况下是mc)。通过强制转换mc创建sprite时,将引用(内存地址)传递给sprite var。此时mc和sprite指向内存中的相同地址。将精灵投射到MovieClip时,您从mc传递相同的地址。而这个地址是MovieClip mc的地址,此时currentFrame将访问mc的值。转换不像复制构造函数

编辑。 通过使用这个link,我创建了简单的代码来证明我的话:

var memoryHash:String;

var mc: MovieClip = new MovieClip();
var s: Sprite = Sprite( mc );
try
{
      FakeClass(mc);
}
catch (e:Error)
{
    memoryHash = String(e).replace(/.*([@|\$].*?) to .*$/gi, '$1');
}

trace( memoryHash );
try
{
    FakeClass(s);
}
catch (e:Error)
{
        memoryHash = String(e).replace(/.*([@|\$].*?) to .*$/gi, '$1');
}

trace( memoryHash );

和假班:

  

包{       公共类FakeClass {           公共函数FakeClass(){}       }   }

输出将显示mc和s的内存地址。你可以看到,他们是平等的。在我的mashine中,输出是

  

@ 35ed041   @ 35ed041

答案 1 :(得分:0)

我不确定你在这里要做什么,但像MovieClip(sprite).currentFrame这样的东西显然会导致奇怪的结果。因为您将精灵投射为动画片段,所以它将具有当前帧。尝试对精灵执行currentFrame,看看会发生什么。