-1

我试图在这里问这个问题,但无法得到满意的答案。(为什么编译器应该允许函数中参数的超类)再次尝试询问。为什么在类上进行强制转换时不会丢失成员函数?在下文中,我预计,在转换为 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”)

五。

4

2 回答 2

2

Cast 不会清除成员字段。投射显示其他人可以从此对象访问但不更改对象的内容。

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

编辑。通过使用此链接,我创建了简单的代码来证明我的话:

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

于 2013-03-05T14:43:31.223 回答
0

我不确定您要在这里做什么,但是像 MovieClip(sprite).currentFrame 这样的事情显然会导致奇怪的结果。因为您将您的精灵投射为一个影片剪辑,所以它将有一个当前帧。尝试在精灵上做 currentFrame 看看会发生什么。

于 2013-03-05T14:40:06.847 回答