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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   ActionScript 3.0 特設会議室
     リンケージのベースクラスについて
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
aruru
Åê¹ÆNo.34163
投稿日時: 2007-7-16 16:47
新米
居住地:
投稿: 4
使用環境:
Windows XP
Flash CS3
リンケージのベースクラスについて
Flash CS3になってからリンケージの設定でベースクラスが指定できるようになっています。
(MovieClipの場合にはデフォルトではflash.display.MovieClipが当てられています)

このベースクラスのどういったものなのでしょうか?

私の考えでは作成したMovieClipに当てるクラスを生成する時に、
わざわざimport flash.display.MovieClipを継承させる必要を無くすもので、
リンケージに当てるクラスのスーパークラスに当たるものだと思っています。

ただのスーパークラスなら独自に作成したクラスも使えるのかと思い、
以下のコードで試してみました。

//ドキュメントクラス
package{
import flash.display.MovieClip
public class Main extends MovieClip{
public function Main(){
trace( "メイン" );
}
}
}

//作成したMovieClipのリンケージのベースクラスに当てるクラス
package{
import flash.display.MovieClip;
public class Test1 extends MovieClip{
public function Test1(){
}
}
}


//作成したMovieClipのリンケージのクラスに当てるクラス
package {
public class Test2{
public function Test2(){
}
}
}

適当にMovieClipを作成し、そのMovieClipのリンケージのベースクラスに
Test1クラスを当てて、リンケージの方にTest2を当ててます。

と行おうとするとリンケージの設定時にエラーが発生します。

「指定されたクラスは定義済みで自分自身のサブクラスを拡張しているので、基本クラスは使用されません。
基本クラスを使用する場合は、自動生成される[クラス]フィールドでクラス名を指定するか、
デフォルトの基本クラス'flash.display.MovieClip'を[基本クラス]フィールドに入力してください」

といったエラーになります。

これを回避するために、リンケージのクラスファイル名を実際に存在していないクラスファイル名を
指定してあげるとなぜかエラーが発生せずパブリッシュまで行えます。


ただこの方法で作られた(自動で作られたクラスファイル?)では、
実際のそのMovieClipの処理を記述する場所がわかりません。

どうにかして独自のクラスファイルをベースクラスに当てる事は可能なのでしょうか?


よろしくお願いします
ニノミヤ カズノリ
Åê¹ÆNo.34170
投稿日時: 2007-7-17 5:32
職人
居住地: 東京
投稿: 430
使用環境:
CS4
.4.11, .5.7
XP Pro(sp3)
Flash Player 10,0,22,87,
AIR 1.5.1,
IE 5.5 & 6 & 7 & 8,
Firefox 2.0.0.20 & 3.0.11 & 3.5,
Opera 9.64,
Safari 4,
Google Chrome 2.0.172.31,
Netscape 7.1
Re: リンケージのベースクラスについて
以下、自分が調べた物ですので間違いがあるかもしれません。

引用:
このベースクラスのどういったものなのでしょうか?

ベースクラスには継承元のクラスが入っています。

このベースクラス、どんな時に使用するのか説明する前に、Flash[AS3.0]において、
シンボルのクラスが重複してはいけないと言うのはご存知でしょうか。
もし重複していた場合、エラーが発生します。

このエラーで問題になるのは、例えば「Test」クラスと言うものがあり、
二つのシンボルに適用させたいとしても重複エラーによってそれは出来ないということです。

ではどうするのか。

ここでベースクラスが登場します。
ベースクラスに「Test」と入力し、クラスに適当な名前(二つのシンボルがかぶらない名前、さらに言えば未定義のもの)を入力すれば、
Testを継承した新しいクラスが作成され、適用できる訳です。


簡単にまとめると、

1.「Test」クラスを単一のシンボルに適用させたい場合
クラス:Test
ベースクラス:デフォルト

2.「Test」クラスを複数のシンボルに適用させたい場合
クラス:適当な名前(未定義のもの)
ベースクラス:Test

という感じになるでしょう。


この様な事から、aruruさんが想像していた使い方とは違っていると思います。

Test1をスーパークラスにしたTest2をシンボルのクラスに指定したい場合、下記となります。
package {
    public class Test2 extends Test1
    {
        public function Test2() {}
    }
}

単一のシンボルに適用させる場合
クラス:Test2
ベースクラス:flash.display.MovieClip

複数のシンボルに適用させる場合
クラス:適当な名前(未定義のもの)
ベースクラス:Test2
aruru
Åê¹ÆNo.34181
投稿日時: 2007-7-17 19:14
新米
居住地:
投稿: 4
使用環境:
Windows XP
Flash CS3
Re: リンケージのベースクラスについて
返信遅くなってすみません。


>シンボルのクラスが重複してはいけないと言うのはご存知でしょうか。
こちらは把握していました。
重複がいけないと言うことでalpha版の時に
MovieClipを複数生成する時に不便さを感じていました。

その不便さを解消する為に出来たのがベースクラスだと思い
こういったことが出来ないのか試してみた所でした。

具体的に何がしたかったと言いますと、

ボタンの機能を持ったSimpleButtonクラスを作成し、
そのSimpleButtonクラス一つで全てのボタンMCに
ボタン機能を持たせる方法ないのかなと思ってました。

ニノミヤ様が仰ってるように現状リンケージのクラスにSimpleButtonクラスを使用してしまうと
重複が出来ない為に他のMCに適用するにはMC毎に名前を変えないといけません。

もし一つのSimpleButtonクラスで行おうとした場合には、
リンケージのクラスに何かしらクラスファイルを当てて、
そのクラスファイルでこのSimpleButtonボタンをインポートする方法になってしまいます。

問題はこれで解決出来るのですが、
ボタンを作るのにわざわざクラスファイルを毎回作り、
インポートしなければけないという作業をどうにかして省けないか考えたところ
ベースクラスにSimpleButtonクラスを適用できれば解決できるのでは?と思いました。

私のSimpleButtonクラスはボタンのイベントの管理しかしていませんので、
ニノミヤ様が仰ってるように複数のシンボルにクラスを適用させるには、
未定義のクラス名を使用するしかないとなると、

未定義のクラスファイルだとクラスファイルに直接処理をかけない?ので
SimpleButtonクラスをベースクラスとしたサブクラスにボタンの各イベント処理を
書くときにはオーバーライドまたはイベントをさらにそこから拾うといった方法になっちゃうのかなと。
(素直にソースコードでインポートすれば良いのですが・・・)

こういった使い方がそもそもベースクラスに出来ない!
という仕様ならばそれでいいのですが・・・何か出来そうな気がしてしまい質問してみました。


やはり面倒ですが素直に毎回コードでインポートするしかないのでしょうか。
野中文雄
Åê¹ÆNo.34183
投稿日時: 2007-7-17 20:59
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: リンケージのベースクラスについて
何を悩んでいらっしゃるのか、具体的に把握できません。

また、「インポートする」というのは、import指示子の使用をいわれているのでしょうか? でしたら、トップレベル、具体的にはたとえばflaファイルと同階層にクラス(as)ファイルを配置すれば、import宣言は要りません。

違う意味でいわれているのでしたら、ヘルプなどで用いられているもっと一般的な用語でご説明ください。→【自分にしかわからない用語を使う

ひとつのクラスを複数のシンボルに適用されたいのでしたら、ニノミヤさんのご説明されたとおり[基本クラス]に設定し、[クラス]には一意の識別子を入力します。そのクラスが定義されていなければ、空のクラスが自動的に作成されます。

そのクラスを継承して、「イベント処理」などのメソッドを追加したサブクラスを定義されたのでしたら、それを[クラス]に指定します。そのサブクラスをさらに複数のシンボルに適用したいという場合には、[基本クラス]に設定すればよいでしょう。

「毎回コードでインポートする」という意味がわかりかねます。
引用:
aruruさんは書きました:
問題はこれで解決出来るのですが、
ボタンを作るのにわざわざクラスファイルを毎回作り、
インポートしなければけないという作業をどうにかして省けないか考えたところ
ベースクラスにSimpleButtonクラスを適用できれば解決できるのでは?と思いました。

私のSimpleButtonクラスはボタンのイベントの管理しかしていませんので、
ニノミヤ様が仰ってるように複数のシンボルにクラスを適用させるには、
未定義のクラス名を使用するしかないとなると、

未定義のクラスファイルだとクラスファイルに直接処理をかけない?ので
SimpleButtonクラスをベースクラスとしたサブクラスにボタンの各イベント処理を
書くときにはオーバーライドまたはイベントをさらにそこから拾うといった方法になっちゃうのかなと。
...[中略]...
やはり面倒ですが素直に毎回コードでインポートするしかないのでしょうか。


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

aruru
Åê¹ÆNo.34188
投稿日時: 2007-7-18 2:52
新米
居住地:
投稿: 4
使用環境:
Windows XP
Flash CS3
Re: リンケージのベースクラスについて
なんて説明して良いのかちょっと私にもわからなくなってきました・・・。


>また、「インポートする」というのは、import指示子の使用をいわれているのでしょうか? でしたら、トップレベル、具体的にはたとえばflaファイルと同階層にクラス(as)ファイルを配置すれば、import宣言は要りません。
インポートの件は仰るとおりでimportのつもりで使っていました。申し訳ありません。


何パターンかリンケージのベースクラスとクラスの使い方に書いてみました。
これでうまく伝わらないようでしたら暫く説明できるように考えてきます。


使用するasファイル

 Main.as
  ドキュメントクラス
 SimpleButton.as
  SimpleButtonクラスにはオーバーライド用にFunctionの定義と各ボタンのイベントの管理がされています。
  flash.display.MovieClipを継承している。
 Button1.as
  SimpleButtonを継承するクラス

使用するライブラリのMC
 btn_mc1


-----------------------------------------
例1)
 リンケージのクラス名にButton1クラスを当ててそこからSimpleButtonを継承する。

btn_mc1のリンケージ設定
 クラス名 Button1
 ベースクラス名 flash.display.MovieClip

//Button1.as
package {
public class Button1 extends SimpleButton{

public function Button1(){}

//SimpleButtonからのオーバーライド
public function onRelease():void{}
public function onPress():void{}
public function onRollOver():void{}
public function onRollOut():void{}
public function onReleaseOutside():void{}
public function onDragRollOver():void{}
public function onDragRollOut():void{}

}
}

これで問題はないがSimpleButtonを継承させるコードを記述する必要がある。

---------------------------------------------
例2)
 リンケージのクラスに指定されたものはベースクラスを継承するならば
 ベースクラスにSimpleButtonを指定する事で例1)のButton1.as外部ファイルで
 記述したSimpleButtonを継承するコードを記述する必要はなくなる?

btn_mc1のリンケージ設定
 クラス名 Button1
 ベースクラス名 SimpleButton

//Button1.as
package {
public class Button1{

public function Button1(){}

//SimpleButtonからのオーバーライド
public function onRelease():void{}
public function onPress():void{}
public function onRollOver():void{}
public function onRollOut():void{}
public function onReleaseOutside():void{}
public function onDragRollOver():void{}
public function onDragRollOut():void{}

}
}

リンケージの設定でエラーが発生。
既に定義されているButton1クラスはクラスとして当てれない。
未定義のクラスなら当てれる。(自動で作成される空ファイル)
asファイルの外部ファイルとして作成したクラスは当てれない?

-----------------------------------------------
例3)
 例2のように使用する場合には未定義のクラスを当てる必要がある。

btn_mc1
 クラス名 Button2(未定義クラス)
 ベースクラス名 SimpleButton

Button2はSimpleButtonクラスを継承しているが、
例1のようにasファイルのクラスが当てられているわけではないので
各ボタンのイベントの処理は直接asファイルに記述できない?
そのために生成した後に処理をつけてあげる必要がある?

//ボタンの生成
var btn_mc:Button2 = new Button2();
btn_mc.onRelease = function(){};
btn_mc.onPress = function(){};
btn_mc.onRollOver = function(){};
btn_mc.onRollOut = function(){};
btn_mc.onReleaseOutside = function(){};
btn_mc.onDragRollOver = function(){};
btn_mc.onDragRollOut = function(){};
btn_mc.onRelease = function(){};

*例3については検証していません。


私が行いたいのは例2の方法になります。
ただ例2の方法だと未定義のクラスしか当てれないという事ですので、
例3のような使い方しか出来ないのかな?と思っています。

これはこれで良いと思うのですが、
ベースクラスにSimpleButtonを当てた時に
例2のように各ボタンのイベントが発生した時の処理を
外部asファイルに記述する方法はあるのかなと思い質問したところでした。

わかりずらい説明ですみませんでした。
内容が伝わらないようでしたらスルーしちゃってください。

よろしくお願いします
野中文雄
Åê¹ÆNo.34189
投稿日時: 2007-7-18 4:16
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: リンケージのベースクラスについて
"extends SimpleButton"のたった2ワードを書きたくないということですか?その利点が、わかりかねます。

もしそれが可能だったとして、Button1のクラス定義自体からは、SimpleButtonのメソッドを「オーバーライド」していることが判別できないでしょう。いくつもあるシンボルの中から、特定の「btn_mc1のリンケージ設定」を開いて初めて判明する構造というのは、理解しにくいことこのうえありません。

「例2の方法だと未定義のクラスしか当て(ら)れない」というのは、[クラス]に適用したいのが実質的に[基本クラス]だからで、[基本クラス]を継承しただけの空のサブクラスをわざわざ書く面倒さを省くためです。サブクラスが明示的に定義されているのであれば、それを[クラス]に設定することに何ら不都合はないように思います。
引用:
aruruさんは書きました:
使用するasファイル

 Main.as
  ドキュメントクラス
 SimpleButton.as
  SimpleButtonクラスにはオーバーライド用にFunctionの定義と各ボタンのイベントの管理がされています。
  flash.display.MovieClipを継承している。
 Button1.as
  SimpleButtonを継承するクラス

使用するライブラリのMC
 btn_mc1

-----------------------------------------
例1)
 リンケージのクラス名にButton1クラスを当ててそこからSimpleButtonを継承する。

btn_mc1のリンケージ設定
 クラス名 Button1
 ベースクラス名 flash.display.MovieClip
//Button1.as
package {
	public class Button1 extends SimpleButton{

		public function Button1(){}
		
		//SimpleButtonからのオーバーライド
		public function onRelease():void{}
		// ...[後略]...

これで問題はないがSimpleButtonを継承させるコードを記述する必要がある。

---------------------------------------------
例2)
 リンケージのクラスに指定されたものはベースクラスを継承するならば
 ベースクラスにSimpleButtonを指定する事で例1)のButton1.as外部ファイルで
 記述したSimpleButtonを継承するコードを記述する必要はなくなる?

btn_mc1のリンケージ設定
 クラス名 Button1
 ベースクラス名 SimpleButton
//Button1.as
package {
	public class Button1{

		public function Button1(){}
		
		//SimpleButtonからのオーバーライド
		public function onRelease():void{}
		// ...[後略]...


リンケージの設定でエラーが発生。
...[中略]...
私が行いたいのは例2の方法になります。
ただ例2の方法だと未定義のクラスしか当てれないという事ですので、
例3のような使い方しか出来ないのかな?と思っています。


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

aruru
Åê¹ÆNo.34194
投稿日時: 2007-7-18 10:31
新米
居住地:
投稿: 4
使用環境:
Windows XP
Flash CS3
Re: リンケージのベースクラスについて
>"extends SimpleButton"のたった2ワードを書きたくないということですか?その利点が、わかりかねます。
例2のような事が出来るのであれば後々にはSimpleButtonクラスではなくて
別の内容のクラスで複数個のimportと継承を行おうかなと思っていました。

>特定の「btn_mc1のリンケージ設定」を開いて初めて判明する構造というのは、理解しにくいことこのうえありません。
良く考えてみるとそうですね。
省く事しか考えていなくて使用易さを考えていませんでした。



一番の目的だったベースクラスとはどういったものなのかという目的は
ニノミヤ様、野中様のおかげで理解できました。
これからもっと触ってみて色々試したいと思います。
ありがとうございました。



Button1.asのコードの方に誤りがあったので訂正します。
オーバーライドなのでoverrideの記述が必要でした。

//SimpleButtonからのオーバーライド
override public function onRelease():void{}
override public function onPress():void{}
override public function onRollOver():void{}
override public function onRollOut():void{}
override public function onReleaseOutside():void{}
override public function onDragRollOver():void{}
override public function onDragRollOut():void{}




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

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