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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     なぜキャストが必要なのか?
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
yakumo
Åê¹ÆNo.46159
投稿日時: 2010-10-18 19:19
常連
居住地: 東京
投稿: 67
使用環境:
WinVista,FlashCS4,Actionscript3.0
なぜキャストが必要なのか?
Main.asをドキュメントクラスとして関連付けられた、
test.flaがあります。
そのメインタイムラインにbtn_mc(MovieClipインスタンス)を配置しています。

/////////////////
Main.as
/////////////////

package {

import flash.display.MovieClip;
import flash.events.MouseEvent;

public class Main extends MovieClip {

/* コンストラクタ */
public function Main() {
btn_mc.addEventListener(MouseEvent.CLICK,xClick);
}

public function xClick(e:MouseEvent):void {
trace(e.target); //[object MovieClip]
var tg:MovieClip = e.target as MovieClip;
tg.rotation += 10;
}

}
}

このコードで「tg」をMovieClipクラスにキャストしている部分で質問があります。
ここでなぜキャストしなければエラーになってしまうのでしょうか。
traceでe.targetを調べると[object MovieClip]と出るので、
なぜ型変換が必要なのか理解できません。

どなたかご教授いただけないでしょうか?

/////////////////////////////////////////////////
※var tg:MovieClip = e.targetにした場合にエラー
「静的型 Object の値が、関連しない可能性が高い型 flash.display.MovieClipに暗黙で変換されています。」
/////////////////////////////////////////////////
野中文雄
Åê¹ÆNo.46160
投稿日時: 2010-10-18 20:18
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: なぜキャストが必要なのか?
Event.targetプロパティはObjectで型指定されています。つまり、Objectとして扱わなければならないということです。Objectインスタンスは、自分よりプロパティやメソッドの多い子の型で指定した変数にはそのまま代入できません。

中学校を受験するときは、小学校の学習指導要領の範囲で問題を解かなければなりません。自分が知っているからといって、方程式を使って解答すれば、指導要領に含まれまれないので×になるようなものです。

参考:「rootプロパティでメインタイムラインの関数にアクセスできない
引用:
yakumoさんは書きました:
public function xClick(e:MouseEvent):void {
	trace(e.target);		//[object MovieClip]
	var tg:MovieClip = e.target as MovieClip;

このコードで「tg」をMovieClipクラスにキャストしている部分で質問があります。
ここでなぜキャストしなければエラーになってしまうのでしょうか。
traceでe.targetを調べると[object MovieClip]と出るので、
なぜ型変換が必要なのか理解できません。


----------------
 

yakumo
Åê¹ÆNo.46161
投稿日時: 2010-10-18 20:51
常連
居住地: 東京
投稿: 67
使用環境:
WinVista,FlashCS4,Actionscript3.0
Re: なぜキャストが必要なのか?
野中様

大変分かりやすく教えていただきありがとうございます。
Event.targetプロパティーはObject型なんですね・・・。

Object型ということであれば、MovieClip型へのキャストが必要であると理解できます。
しかし、下記の調査ではObject型であると知り得ることができませんでした。(trace結果は双方ともMovieClipだと言います。)

▼調査
trace(e.target); trace(getQualifiedClassName(e.target));

どのように調べればMovieClip型ではなくObject型だと知らせてくれるのでしょうか?


野中文雄
Åê¹ÆNo.46163
投稿日時: 2010-10-18 22:01
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: なぜキャストが必要なのか?
プロパティに入った実際の「値」を調べてもわかりません。そのプロパティはどう「定義」されているかが問題だからです。受験生に聞けば、自分のことを答えます。そうでなく、出題者に尋ねなければなりません。

つまり、クラス定義のプロパティが、何のデータ型で指定されているかです。定義済みクラスはActionScriptファイルとして見られませんので、具体的にはリファレンスを調べます。また、エラーメッセージもその情報を伝えています。
引用:
※var tg:MovieClip = e.targetにした場合にエラー
「静的型 Object の値が、関連しない可能性が高い型 flash.display.MovieClipに暗黙で変換されています。」

引用:
yakumoさんは書きました:
しかし、下記の調査ではObject型であると知り得ることができませんでした。(trace結果は双方ともMovieClipだと言います。)

▼調査
trace(e.target); trace(getQualifiedClassName(e.target));

どのように調べればMovieClip型ではなくObject型だと知らせてくれるのでしょうか?


----------------
 

ひろゆき
Åê¹ÆNo.46164
投稿日時: 2010-10-18 23:45
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: なぜキャストが必要なのか?
Event - ActionScript 3.0 言語およびコンポーネントリファレンス
引用:
target プロパティ
target:Object [読み取り専用]
言語バージョン: ActionScript 3.0
ランタイムバージョン: AIR 1.0 Flash Player 9
イベントターゲットです。このプロパティにはターゲットノードが含まれます。例えば、ユーザーが [OK] をクリックした場合、ターゲットノードはそのボタンを含む表示リストノードです。

実装
public function get target():Object


----------------
質問する際は、回答者に具体的な情報を与えてください。

yakumo
Åê¹ÆNo.46165
投稿日時: 2010-10-19 12:50
常連
居住地: 東京
投稿: 67
使用環境:
WinVista,FlashCS4,Actionscript3.0
Re: なぜキャストが必要なのか?
お答え頂いた皆様

理解することができました!
心よりお礼申し上げます。

Object型のe.targetに、MovieClip型のbtn_mcを値として保持しているんですね。
つまり値としてどんな型の値を持とうが、e.target自身はObject型に定義されているものなので、必然的にキャストは必要だということですね。
(traceでの調査結果も値に対しての回答だったので、常にMovieClipと言われていたのですね。)
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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