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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     Class名に応じて処理を分岐させたい
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
testatoo
Åê¹ÆNo.42114
投稿日時: 2009-4-15 19:31
新米
居住地:
投稿: 8
使用環境:
Class名に応じて処理を分岐させたい
はじめまして。
最近AS3を使用するになった初心者です。

表題のとおりClass名に応じて処理を分岐したいのですが、
その方法がよくわかりません。

現在は下記の方法にて対応していますが別の方法がありましたらご教授ください。宜しくお願いします。


○現在の方法

?

var hoge:HogeClass = new HogeClass();
var foo:FooClass = new FooClass();

if(hoge is HogeClass) { HogeClassの場合の処理 }
if(foo is FooClass) {FooClassの場合の処理 }?

?

var className:String = 任意のインスタンス as Object;

switch(className) {
case "[object HogeClass]" :
//HogeClassの場合の処理
brake;

case "[object HogeClass]" :
//FooClassの場合の処理
brake;
}

のような感じでコーディングしていますが、もう少しスマートな方法はないでしょうか?とくの?の方法は文字列ではなくて別の方法たとえばClassクラス等で評価したいのですがいまいちその方法がわかりません。わかる方いましたらどうか宜しくお願いいたします。



うじゅ
Åê¹ÆNo.42121
投稿日時: 2009-4-15 21:52
半人前
居住地:
投稿: 31
使用環境:
WinXP
MX Pro2004, Flash8
Re: Class名に応じて処理を分岐させたい
AS3はよく分かりませんが、instanceof は使えないんでしょうか?

また、クラスの判定では無いのでこのケースで使えるか分かりませんが、if,case 内の処理をクラスの同名メソッドとして用意する形に設計するのがスマートではないでしょうか?

class HogeFoo {
  function doJob(){}
}
class HogeClass extends HogeFoo {
  function doJob(){//HogeClassの場合の処理}
}
class FooClass extends HogeFoo {
  function doJob(){//FooClassの場合の処理}
}
----
var obj:HogeFoo = new HogeClass();
obj->doJob();


----------------
UJU

testatoo
Åê¹ÆNo.42129
投稿日時: 2009-4-16 14:31
新米
居住地:
投稿: 8
使用環境:
Re: Class名に応じて処理を分岐させたい
なるほど、スマートにやるにはやはりオブジェクト指向的な設計が必要になってくるんです。ありがとうございます。その方法をとりいれてやってみます。返信ありがとうございます。
野中文雄
Åê¹ÆNo.42134
投稿日時: 2009-4-17 11:51
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: Class名に応じて処理を分岐させたい
本題の前に、まず機種依存文字はご使用をお控えください。

本題については、具体的におやりになりたい内容によって、適した方法は変わってくると思われます。インスタンスの継承するクラスを判別したいというだけでしたら、is演算子で調べるのでも差支えないでしょう。
引用:
testatooさんは書きました:
○現在の方法

(1)
var hoge:HogeClass = new HogeClass();
var foo:FooClass = new FooClass();

if(hoge is HogeClass) { HogeClassの場合の処理 }
if(foo is FooClass) {FooClassの場合の処理 }

ある具体的な処理で、クラスによってその内容を変えたいという場合には、それをクラスにメソッドとして定義することが有効です。そのメソッドが備わっていることを保障するには、インターフェイスという仕組みが使えます。
package {
	public interface IDoJob {
		function doJob():String;
	}
}

package {
	public class HogeClass implements IDoJob {
		public function doJob():String {
			return "doing the job for HogeClass";
		}
	}
}

package {
	public class FooClass implements IDoJob {
		public function doJob():String {
			return "doing the job for FooClass";
		}
	}
}

// フレームアクション: テスト用
var hoge:HogeClass = new HogeClass();
var foo:FooClass = new FooClass();
xTest(hoge);
xTest(foo);
function xTest(obj:IDoJob):void {
	var result_str:String = obj.doJob();
	trace(result_str);
}


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

testatoo
Åê¹ÆNo.42151
投稿日時: 2009-4-19 23:02
新米
居住地:
投稿: 8
使用環境:
Re: Class名に応じて処理を分岐させたい
引用:

Fumioさんは書きました:
本題の前に、まず機種依存文字はご使用をお控えください。


機種依存文字件、申し訳ございませんでした。
以後気をつけます。

なるほど、インターフェイスの仕組みを利用して先にメソッドを保証しておくわけですね。その上で各クラスで具体的な実装を行っていくと。そうすると、if文を使用した処理分岐も少なくなるという
ことですね。大変参考になりました。ここ数週間AS3に没頭していますが。かなりAS3が好きになりました。今後もこちらで色々と質問させていただくことになるとおもいますがなにとぞ宜しくお願いいたします。

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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