我试着在这里提出这个问题,但无法得到满意的答案。 (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')
诉P>
答案 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,看看会发生什么。