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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     ActionScript2.0におけるメソッド呼び出し時の型指定について
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
nao
Åê¹ÆNo.2727
投稿日時: 2004-1-7 19:59
職人
居住地:
投稿: 208
使用環境:
WinXP Pro
Flash8 Professional
ActionScript2.0におけるメソッド呼び出し時の型指定について
s-nです.
本年度もよろしくお願いいたします.

メソッドの引数の型指定について質問させてください.


メソッドの引数のに型を指定しておくと書き出し時に
チェックしてくれますがその型というのはどういった
指定をするのがいいのでしょうか?
インターフェースの概念自体あまり触ったことがなく
分かってないかもしれません…

以下のようなサンプルを作ってみました.

Test1 interface class
interface Test1 {
	function test1_fnc():Void;
}


Test2 class implements Test1 interface
class Test2 implements Test1 {
	function test1_fnc():Void {
		trace('test1_fnc');		
	}
	function test2_fnc():Void {
		trace('test2_fnc');
	}
}

Test3 class
class Test3 {
	function test3_fnc(param_obj:Test1) {
		param_obj.test1_fnc();
		param_obj.test2_fnc();
	}
}

test.fla 1frame
import Test1;
import Test2;
import Test3;

var test2_obj:Test1 = new Test2();
var test3_obj = new Test3();
test3_obj.test3_fnc(test2_obj);


これを実行するとtest2_fncというメソッドがないと
起こられます.…
test3_fncの引数の方の指定をTest2とすると大丈夫なのですが
test2_objはTest1の型にしているのでtest3_fncの引数の型も
Test1でいいのかな?と思うのですが…
引数で型を指定したメソッド以外は呼べないのでしょうか?

よろしくお願いします.


----------------
nao [seto@graffiti-web.org]

野中文雄
Åê¹ÆNo.2732
投稿日時: 2004-1-7 20:50
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: ActionScript2.0におけるメソッド呼び出し時の型指定について
インタフェースについては、[インタフェースの作成と使用]をご参照ください。
引用:
s-nさんは書きました:
インターフェースの概念自体あまり触ったことがなく
分かってないかもしれません…

Test1 interface class
interface Test1 {
	function test1_fnc():Void;
}

Test2 class implements Test1 interface
class Test2 implements Test1 {
	function test1_fnc():Void {
		trace('test1_fnc');		
	}
	function test2_fnc():Void {
		trace('test2_fnc');
	}
}

Test3 class
class Test3 {
	// function test3_fnc(param_obj:Test1) {
	function test3_fnc(param_obj:Test2) {
		param_obj.test1_fnc();
		param_obj.test2_fnc();
	}
}

test.fla 1frame
import Test1;
import Test2;
import Test3;

// var test2_obj:Test1 = new Test2();
var test2_obj:Test2 = new Test2();
var test3_obj = new Test3();
test3_obj.test3_fnc(test2_obj);

クラスTest1には、test2_fnc()というメソッドが定義されていません。Test1を実装(implements)したサブクラスTest2で、型づけすべきでしょう。
引用:
これを実行するとtest2_fncというメソッドがないと
起こられます.…


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

youich
Åê¹ÆNo.2735
投稿日時: 2004-1-7 21:45
職人
居住地: kobe
投稿: 349
使用環境:
Tiger
Re: ActionScript2.0におけるメソッド呼び出し時の型指定について
引用:

test3_fncの引数の方の指定をTest2とすると大丈夫なのですが
test2_objはTest1の型にしているのでtest3_fncの引数の型も
Test1でいいのかな?と思うのですが…

野中さんのおっしゃるように、Test1にはtest2_fncが無いのでだめですね。
interfaceをimplementsするということは、そのinterfaceに定義されてる
functionが実装されてることを保証するということなので、
Test1を引数の型としてとるならtest1_fncだけは確実に呼び出せるということですね。

なので、Test2を引数の型とするか、Test1にtest2_fncを追加するかでしょうか。
引用:

引数で型を指定したメソッド以外は呼べないのでしょうか?

しかし、test2_objの実体はTest2なのでキャストすれば可能でしょう。

class Test3 {
	function test3_func(obj:Test1):Void {
		obj.test1_func();
		if (obj instanceof Test2) {
			(Test2(obj)).test2_func();
		}
	}
}

2004の型について、あれれっと思ったことを以前ポストしたことがあります。
http://hpcgi2.nifty.com/icutommy/fwiki_ja/wiki.cgi?instanceVariable%26classVariable


----------------
- yo

nao
Åê¹ÆNo.2736
投稿日時: 2004-1-7 21:53
職人
居住地:
投稿: 208
使用環境:
WinXP Pro
Flash8 Professional
Re: ActionScript2.0におけるメソッド呼び出し時の型指定について
野中さん
引用:
インタフェースについては、[インタフェースの作成と使用]をご参照ください。

こちらの方は以前読ませていただきました.
ボクがちょっと理解しきれていなかったようです…

- yoさん
引用:
2004の型について、あれれっと思ったことを以前ポストしたことがあります。
http://hpcgi2.nifty.com/icutommy/fwiki_ja/wiki.cgi?instanceVariable%26classVariable

こちらのほうも後で読ませていただきます.
ありがとうございました.


----------------
nao [seto@graffiti-web.org]

渡辺真太郎
Åê¹ÆNo.2737
投稿日時: 2004-1-7 21:56
新米
居住地: 神奈川県相模原市
投稿: 20
使用環境:
MX2004
XP
Re: ActionScript2.0におけるメソッド呼び出し時の型指定について
引用:

s-n1211さんは書きました:

インターフェースの概念自体あまり触ったことがなく
分かってないかもしれません…


インターフェイスはその名前の通り、あるオブジェクトを操作するためにメソッドの名前と、引数、戻り値を「約束事」として決めるために存在します。
Test2 とTest3 を別々の人が作成したと考えてみましょう。
interface Test1 {
	function test1_fnc():Void;
}


Test3 class
class Test3 {
	function test3_fnc(param_obj:Test1) {
		param_obj.test1_fnc();
		//Test1を実装したクラスがtest2_fncを実装しているかは保障がない。
		//param_obj.test2_fnc();
	}
}

引用:

これを実行するとtest2_fncというメソッドがないと
起こられます.…

Test3を作成した人は、Test1を実装したクラスが引数でくることを期待します。そのために、test2_fncという関数が実装されているかどうかは、本来は分からないはずです。
Test1では test1_fncのみが「約束事」としてきめられいるので、それ以外のメソッドtest2_fncを呼ぼうとしても、コンパイルエラーになります。
import Test1;
import Test2;
import Test3;

//var test2_obj:Test1 = new Test2();
var test2_obj:Test2 = new Test2();//型はTest2で良い。
var test3_obj = new Test3();
//test3_fncの引数の型はTest1だがTest2はTest1を実装してるのでコンパイルエラーにならない。
test3_obj.test3_fnc(test2_obj);


この様にTest3を作った人からみれば、Test1さえ実装していて、
test1_fnc()が存在することが保障されれば、実はどんなクラスであっても関係ないと言うのがインターフェイスの利点だとおもいます。
特に多重継承が行えない言語では、クラス間の結束をゆるくできるために、汎用性の高いクラスを作成することができます。

例)
Test3 の test3_fncの引数型をTest2にした場合にはTest2または、そのサブクラスのインスタンスのみが引数として成立します。
さらに他の人がTest4というクラスをつくったときに、そのインスタンスはtest3_fncの引数になることはできなくなってしまいます。
nao
Åê¹ÆNo.2739
投稿日時: 2004-1-7 22:03
職人
居住地:
投稿: 208
使用環境:
WinXP Pro
Flash8 Professional
Re: ActionScript2.0におけるメソッド呼び出し時の型指定について
shintaxさん

引用:
var test2_obj:Test2 = new Test2();//型はTest2で良い。

そうですよね…
なぜかクラスの実装しているインターフェースをインスタンスの型にするのがいいと思い込んでたもので…

ありがとうございます.


----------------
nao [seto@graffiti-web.org]

youich
Åê¹ÆNo.2741
投稿日時: 2004-1-7 23:00
職人
居住地: kobe
投稿: 349
使用環境:
Tiger
Re: ActionScript2.0におけるメソッド呼び出し時の型指定について
引用:
なぜかクラスの実装しているインターフェースをインスタンスの型にするのがいいと思い込んでたもので…

いや、そうじゃないですか?できるならインターフェースの型を使って、
インターフェースに対してコーディングするほうがいいんじゃないかと、ぼくは思います。。。


----------------
- yo

渡辺真太郎
Åê¹ÆNo.2742
投稿日時: 2004-1-7 23:41
新米
居住地: 神奈川県相模原市
投稿: 20
使用環境:
MX2004
XP
Re: ActionScript2.0におけるメソッド呼び出し時の型指定について
引用:

youichさんは書きました:
引用:
なぜかクラスの実装しているインターフェースをインスタンスの型にするのがいいと思い込んでたもので…

いや、そうじゃないですか?できるならインターフェースの型を使って、
インターフェースに対してコーディングするほうがいいんじゃないかと、ぼくは思います。。。


そ、そうなんですか(汗
その場合素朴な疑問がわいてくるのですが、複数インターフェイスを実装していた場合は、どうするのがよいのでしょうか?
インスタンスを生成するときは、そのクラス型にして、
引数として渡すときにキャストするって感じになるんでしょうか?
便乗の質問ですいません。m(_ _)m
youich
Åê¹ÆNo.2748
投稿日時: 2004-1-8 3:19
職人
居住地: kobe
投稿: 349
使用環境:
Tiger
Re: ActionScript2.0におけるメソッド呼び出し時の型指定について
引用:

shintaxさんは書きました:
引用:

youichさんは書きました:
引用:
なぜかクラスの実装しているインターフェースをインスタンスの型にするのがいいと思い込んでたもので…

いや、そうじゃないですか?できるならインターフェースの型を使って、
インターフェースに対してコーディングするほうがいいんじゃないかと、ぼくは思います。。。


そ、そうなんですか(汗
その場合素朴な疑問がわいてくるのですが、複数インターフェイスを実装していた場合は、どうするのがよいのでしょうか?
インスタンスを生成するときは、そのクラス型にして、
引数として渡すときにキャストするって感じになるんでしょうか?
便乗の質問ですいません。m(_ _)m

いや、できるならということで、なんでもということではないです。(^^;
しかし両方のinterfaceが必要として、もしやるとしたら、interfaceの継承とかでしょうか。

え、でも、interfaceで型宣言するってそんな変ですか?
ちょと、心配になってwebを見て周りましたけど、そんなに、
奇怪なことではないと思うんですけど。。(^^;

http://java-house.jp/ml/archive/j-h-b/026090.html#body
http://java-house.jp/ml/archive/j-h-b/026167.html#body
http://java-house.jp/ml/archive/j-h-b/026085.html#body
すいません、人まかせにして


----------------
- yo

渡辺真太郎
Åê¹ÆNo.2749
投稿日時: 2004-1-8 4:01
新米
居住地: 神奈川県相模原市
投稿: 20
使用環境:
MX2004
XP
Re: ActionScript2.0におけるメソッド呼び出し時の型指定について
引用:


いや、できるならということで、なんでもということではないです。(^^;
しかし両方のinterfaceが必要として、もしやるとしたら、interfaceの継承とかでしょうか。

え、でも、interfaceで型宣言するってそんな変ですか?
ちょと、心配になってwebを見て周りましたけど、そんなに、
奇怪なことではないと思うんですけど。。(^^;



すいません、確かにおっしゃるとおりです。
自分でも普段interfaceで型宣言することありますね。(^^;
さっきのソースは

import Test1;
import Test2;
import Test3;

var test2_obj:Test2 = new Test2();
var test3_obj = new Test3();
test3_obj.test3_fnc(test2_obj);

/*
このスコープ内でtest2_fncを呼ぶ可能性が
あるかもしれないからTest2型じゃないと
だめだなぁと勝手に決め付けてました。。。

test2_obj.test2_fnc();
*/


ちょっと頭が回ってなかったみたいです。
失礼いたしました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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