メイン コーダーズルーム【スクリプト系】 クラス内の変数について | 投稿するにはまず登録を |
フラット表示 | 前のトピック | 次のトピック |
投稿者 | スレッド |
---|---|
takiguchi | Åê¹ÆNo.3527 投稿日時: 2004-2-5 7:02 |
半人前 居住地: 東京 投稿: 38
使用環境:
|
クラス内の変数について (2004/2/9 修正・ムダを省きました)
win2000/Flash MX 2004 v7.0.1で ActionScript 2.0 を使ってOOPの勉強をしています。 OOPの勉強を始めたばかりなのですが、 クラスを作成する時に、ちょっと疑問に思うことがあります。 ■プロパティについて プロパティは、メソッドの外側のクラス内で宣言された変数で、 同一クラスのメソッドやサブクラスからアクセスすることができる。 ■メソッド(コンストラクタ関数含む)内で宣言された変数(プロパティではない変数) メソッド内で宣言された変数(引数含む)は、そのメソッド内でのみ有効で、 メソッドの最後に無効となる。 従って、同一クラスの他のメソッドやサブクラスからアクセスすることができない。 …と私なりに考えているのですが、疑問点は下記の通りです。 (特にマニュアルのローカル変数についての記述を読んで 「う?ん?」と考え込んでしまいました。) [疑問点] 1.メソッドの引数をvarステートメントを使って宣言する必要はあるのでしょうか? 2.異なるメソッドの引数で同じ名前を使ってもコンフリクトは起こらないのでしょうか? 3.メソッド内で宣言された変数と同じ名前の変数を他のメソッドで宣言しても コンフリクトは起こらないのでしょうか? 4.クラスのプロパティと同じ名前の変数をメソッドで宣言しても コンフリクトは起こらないのでしょうか? 5.MovieClip.gotoAndPlayメソッド(引数としてString又はNumber)のようにオーバーロードされた メソッドを定義する場合、MovieClip.asを参照してみると引数をObjectとしていますが、 クラスの階層構造が良く分からないので理解に苦しんでいます。 StringクラスとNumberクラスはObjectクラスのサブクラスなのかなぁ?? という感じはしてるんですけど… 私なりに以下のような実験をしてみました。 例1)疑問1用の実験 --------------------------------------------------------------------- //MyClass1.as class MyClass1 { function method(param1:String, param2:Number):Void { trace("param1:"+param1+", param2:"+param2); } } --------------------------------------------------------------------- //MyClass2.as class MyClass2 { function method(param1, param2):Void { var param1:String; var param2:Number; trace("param1:"+param1+", param2:"+param2); } } --------------------------------------------------------------------- //MyClass2a.as class MyClass2a { function method(param1:String, param2:Number):Void{ var param1:String=new String(); var param2:Number=new Number(); trace("param1:"+param1+", param2:"+param2); } } --------------------------------------------------------------------- //FLAファイル //メインタイムライン:フレーム1 var a:String="test"; var b:Number=100; var c:MyClass1= new MyClass1(); var d:MyClass2= new MyClass2(); var e:MyClass2a= new MyClass2a(); c.method(a,b); //出力 param1:test, param2:100 //c.method(b,a)はエラー d.method(a,b); //出力 param1:test, param2:100 //d.method(b,a)はエラーなし e.method(a,b); //出力 param1:, param2:0 //e.method(b,a)はエラー d.method(b,a); //出力 param1:100, param2:test --------------------------------------------------------------------- いつもメソッドを定義する時はMyClass1のやり方で引数を宣言しているのですが、 MyClass2のような記述もOKなのでしょうか?(特にエラーにならないですし…) それとMyClass1とMyClass2で違いはあるのでしょうか? 例2)疑問2,3,4用の実験 --------------------------------------------------------------------- class MyClass { //プロパティ定義 var param1:String = "unset"; var param2:Number = 0; //コンストラクタ関数 function MyClass(param1:String, param3:Number) { //var a:MyClass=new MyClass("Hello",100); var param2:Number = param3; trace(param1+","+param2); //出力 Hellow,100 trace(this.param1+","+this.param2); //出力 unset,0 } //メソッド定義 function method1(Void):Void { trace(param1+","+param2); //出力 unset,0 } function method2(param1:String, param2:Number):Void { // a.method2("abcd",10); trace(param1+","+param2); //出力 abcd,10 trace(this.param1+","+this.param2); //出力 unset,0 } function method3(Void):Void { var param1:String = "ABCD"; var param2:Number = 20; trace(param1+","+param2); //出力 ABCD,20 trace(this.param1+","+this.param2); //出力 unset,0 } } --------------------------------------------------------------------- //FLAファイル //メインタイムライン:フレーム1 var a:MyClass=new MyClass("Hello",100); a.method1(); a.method2("abcd",10); a.method3(); --------------------------------------------------------------------- 上記の結果ではメソッド内で宣言された変数は独立していて、 他のメソッドの変数やプロパティとはコンフリクトが起こらないみたいです。 ただし、クラスのプロパティと同じ名前の変数がメソッドで宣言されている場合は、 メソッド内で宣言されている変数が優先される感じです。 ということは、クラスのプロパティと同じ名前の変数をメソッドで宣言すると、 そのメソッドからアクセス不可能なプロパティが存在してしまうことになるのでしょうか? 変数の名前が重複することは避けるべきだとは思いますが… 何分、私には英語力がないので、一つ一つ別の変数名を考えるのが 正直かなりの負担となってます。 コンフリクトが起こらないと保証される局面では、重複した名前の変数を 使って、ちょっとは楽できるかなぁ?と思ってます。 あと、5.オーバーロードのやり方はどうやって調べれば良いか分かりませんでした。 以上のことに関するアドバイスや間違った理解をしている等のご指摘をして頂けると助かります。 |
フラット表示 | 前のトピック | 次のトピック |
投稿するにはまず登録を | |