メイン 迷える子羊の部屋【初心者専用】 なぜキャストが必要なのか? | 投稿するにはまず登録を |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
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さんは書きました: |
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にした場合にエラー 引用: yakumoさんは書きました: |
ひろゆき | Åê¹Æ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 プロパティ
|
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と言われていたのですね。) |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |
投稿するにはまず登録を | |