-1

ここでこの質問をしようとしましたが、満足のいく答えが得られませんでした。(コンパイラが関数内のパラメーターのスーパークラスを許可する必要があるのはなぜですか) もう一度尋ねようとしています。クラスで行われたときに、キャストがメンバー関数を失わないのはなぜですか? 以下では、スプライトにキャストした後、クラスは現在のフレームに関するすべての情報を失うはずだと予想しました。しかし、キャスティングが単なる「見せびらかし」であり、内部で「実際に行われた」わけではないかのように、情報を保持しますか?

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

私が知っている、答えは、アドビがそれをした方法である可能性があります。しかし、ロジックは何ですか?理想的なロジックは、キャストと再キャストの後、すべての値をデフォルトに復元する必要があるというものです。(この場合は「0」)

V.

4

2 に答える 2

2

キャストはメンバー フィールドをクリアしません。キャストは、他のユーザーがこのオブジェクトからアクセスできるものを示しますが、オブジェクトを変更することはできません。

Flash オブジェクトは参照によって渡されます。メモリ内にオブジェクトがあると想像してください(あなたの場合は mc )。mc をキャストしてスプライトを作成するときは、参照 (メモリ アドレス) をスプライト変数に渡します。この時点で mc と 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 );

そしてフェイククラス:

package { public class FakeClass { public function FakeClass() {} } }

出力には、mc と s のメモリ アドレスが表示されます。ご覧のとおり、それらは等しいです。私のマシンでは、出力は

@35ed041 @35ed041

于 2013-03-05T14:43:31.223 に答える
0

ここで何をしようとしているのかはわかりませんが、 MovieClip(sprite).currentFrame のようなものは明らかに奇妙な結果につながります。スプライトをムービークリップとしてキャストしているため、現在のフレームがあります。スプライトで currentFrame を実行して、何が起こるか見てみましょう。

于 2013-03-05T14:40:06.847 に答える