トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     型のキャスト
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
ペコ
Åê¹ÆNo.34626
投稿日時: 2007-8-10 21:29
新米
居住地: 埼玉一歩手前
投稿: 19
使用環境:
WinXP,Flash MX2004pro
Flashout,ASDT,MTASC,Eclipse
PDT
型のキャスト
子のクラスを親の型にキャストしていますが、
null となってしまいます。

Abstract.as

class Abstract extends MovieClip
{
	public function attach():Abstract
	{
		var depth:Number   = this.getNextHighestDepth();
		var linkage:String = "child";
		var name:String    = linkage + depth;
		
		return Abstract(this.attachMovie(linkage, name, depth));
	}
}

Child.as

class Child extends Abstract
{

}


1)ムービークリップインスタンス
AS2クラス:Abstract
リンケージ:abstract
2)ムービークリップインスタンス
AS2クラス:Child
リンケージ:child

二つムービークリップシンボルをつくり
1)を_root.abstractとして配置。

_rootフレームアクション

trace(this.abstract.attach());


出力の期待は
_root.abstract.child0

なんですが、nullと出力されます。
キャストどのようにすればよいのでしょうか?



あ、今手元にあった、Flash8で試してみましたが
正常に出力されました・・・・・。
Flash MX 2004で現象がでています。
ニノミヤ カズノリ
Åê¹ÆNo.34636
投稿日時: 2007-8-12 14:16
職人
居住地: 東京
投稿: 430
使用環境:
CS4
.4.11, .5.7
XP Pro(sp3)
Flash Player 10,0,22,87,
AIR 1.5.1,
IE 5.5 & 6 & 7 & 8,
Firefox 2.0.0.20 & 3.0.11 & 3.5,
Opera 9.64,
Safari 4,
Google Chrome 2.0.172.31,
Netscape 7.1
Re: 型のキャスト
こちらでもFlash MX 2004にて試してみましたが、ペコさんの期待通りの結果(_root.abstract.child0)が返ってきました。
ソースコードやasファイルの位置、シンボルの設定がおかしくないかもう一度調べてみてはいかがでしょうか。
ペコ
Åê¹ÆNo.34658
投稿日時: 2007-8-13 21:24
新米
居住地: 埼玉一歩手前
投稿: 19
使用環境:
WinXP,Flash MX2004pro
Flashout,ASDT,MTASC,Eclipse
PDT
Re: 型のキャスト
ニノミヤ カズノリ様

原因が分かりました。
ちょっと家で作ったサンプルファイルが実際のコードとはちがっており、その違いが原因でした。
Abstractクラスを継承したChildクラスでattachMovieのターゲット管理を行うために、privateに "_target"という名前を使っており、
同名のMovieClip._targetとバッティングしたからだと分かりました。

Abstract.as

class Abstract
{
	/**
	 * アタッチするターゲット
	 */
	private var _target:Abstract;//コイツが原因
	
	/**
	 * コンストラクタ
	 */
	public function Abstract()
	{
		this._target = this;//デフォルトは同じ階層
	}

	public function attach():Abstract
	{
		var target:Entry = this._target;
		var depth:Number   = this.getNextHighestDepth();
		var linkage:String = "child";
		var name:String    = linkage + depth;
        
		return Abstract(target.attachMovie(linkage, name, depth));
	}
}


Child.as

class Child extends Abstract
{
	/**
	 * コンストラクタ
	 */
	public function Child()
	{
		this._target = Abstract(this._parent);//一個上
	}
}


"private"は "_"(アンダーバー)から始める
というコーディング規則があり、同名プロパティに気づきませんでした・・・・・・。

もっと基本的なことから注意しなくてはいけませんね。

有難うございました。
ペコ
Åê¹ÆNo.34675
投稿日時: 2007-8-14 19:29
新米
居住地: 埼玉一歩手前
投稿: 19
使用環境:
WinXP,Flash MX2004pro
Flashout,ASDT,MTASC,Eclipse
PDT
Re: 型のキャスト
すいません。
どうやら原因はそれだけではなかったようなのです。
いろいろテストした結果。

「パッケージと同名の(空ではない)変数がいるとキャストできない」

という結論になりました。

flaファイルと同階層に aaa フォルダを作り A.as ファイルを記述します。

aaa\A.as

class aaa.A extends MovieClip
{
	/**
	 * AにキャストしたMovieClipインスタンスを作る
	 */
	public function cast():A
	{
		var depth:Number = this.getNextHighestDepth();
		var linkage:String = "a";
		var name:String = linkage + depth;
		return A(this.attachMovie(linkage, name, depth));
	}
}


_rootフレームアクション

/**
 * a というインスタンス名でAクラスを指定した
 * ムービークリップシンボルを配置
 */
var aaa = "";	//型指定はこの際無しで
				//var aaa;では現象がおきません。
trace(a.cast());



先の質問も。実際にはパッケージに入っており、
その大元のパッケージ名と同名の変数名がありました。

ただ
package.subpackage.Class
の場合、
var package = "";
ではキャストできませんが、
var subpackage = "";
ではキャストできました。



はまりました。
ニノミヤ カズノリ
Åê¹ÆNo.34678
投稿日時: 2007-8-14 22:13
職人
居住地: 東京
投稿: 430
使用環境:
CS4
.4.11, .5.7
XP Pro(sp3)
Flash Player 10,0,22,87,
AIR 1.5.1,
IE 5.5 & 6 & 7 & 8,
Firefox 2.0.0.20 & 3.0.11 & 3.5,
Opera 9.64,
Safari 4,
Google Chrome 2.0.172.31,
Netscape 7.1
Re: 型のキャスト
パッケージ名と同名の変数は作成してはいけません。

パッケージ(aaa)は一つのオブジェクトであり、フレームにパッケージと同名の変数を宣言した場合、その変数の値に置き換わってしまい、内包しているクラス(A)は全て失われてしまいます。

この事から、パッケージ名と同名の変数の作成は避けなければなりません。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops