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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   ActionScript 3.0 特設会議室
     インターフェースでの一括呼び出し、、?!
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
pizza
Åê¹ÆNo.45726
投稿日時: 2010-9-11 13:06
新米
居住地:
投稿: 24
使用環境:
MAC バージョン10.5.8

FLASH CS3

AS3.0

Firefox 3.5.2
Safari 4.0.3
インターフェースでの一括呼び出し、、?!
いつもお世話になっております。

タイトルだとちょっとわかりにくいと思うのですが、

たとえば、一個のインターフェース
"IUpdataクラス"

package  
{
	public interface IUpdata 
	{
		function updata():void;
	}	
}

があったとして、

それをimplementsした"Parentクラス"をつくるとします。

さらに、その"Parentクラス"の子階層として
IUpdataをimplementsをした"Childクラス"をつくるとします。

クラスの階層的には、


Mainクラス
 |
  L Parentクラス(IUpdataを継承)
    |
     L Childクラス(IUpdataを継承)


といった感じになっているとします。

以下 "Parentクラス"

package 
{	
	import flash.display.Sprite;
	
	public class Parent extends Sprite implements IUpdata
	{
        //子階層のクラス。 パブリックでParent.childで取ってこれるようにしてある
		public var child:Child;
		
		public function Parent():void
		{		
			child = new Child();
		}
		
		/* INTERFACE IUpdata */
		
		public function updata():void
		{
			trace("parent");
		}
	}
}

ただ、Childクラスを生成しているだけです。Parent.child で"Childクラス"の値が取ってこれるようにpublicにしてあります。
(getter / setter の部分は今回は関係ないのでpublicにしちゃってあります)
あとはインターフェースのudata()があります



以下 "Childクラス"

package 
{	
	import flash.display.Sprite;
	
	public class Child extends Sprite implements IUpdata
	{
		
		public function Child():void
		{		
		}
		
		/* INTERFACE IUpdata */
		public function updata():void
		{
			trace("child");
		}
		
	}
}

こちらも単純にupdata()があるだけです。



普段、インターフェースを継承したクラスでは
配列( 今回は : _arrayList )を作って、その中にpushしてあげて、それをfor each文で回してあげるというやりかたをしておりました。

今回のように、子階層にあるクラスも一括で呼び出してupdata()メソッドを実行させたい時に、

"Mainクラス"

package

--中略--

var _arrayList:Array = [];

_arrayList.push(parent);
_arrayList.push(parent.child);

for each(var obj:IUpdata in _arrayList) 
{
	obj.updata();
}

--中略--


出力: parent
   child



のような感じで行った方法しか分からずこれでやってきました。


実際にこれぐらいの階層の深さならいいのですが、
階層が5階層とかになってくるとわけわかんなくなってしまいそうで、、、


で、同じインターフェースを継承しているクラスを階層関係なく呼び出せる方法があるのかという疑問にいたったわけです。


みなさまはこういった状態のときいどのような書き方をしているのかを気になり投稿させていただきました!!


みなさまのやられている書き方を参考までに教えていただけると幸いです。


野中文雄
Åê¹ÆNo.45727
投稿日時: 2010-9-11 20:23
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: インターフェースでの一括呼び出し、、?!
まず、「クラスの階層」というのは主観的な気分であって、客観的な設計(デザイン)としてはふたつのクラスには何の関わりもなく、同じインタフェースを実装しているだけに見受けられます。

「わけわかんなくな」るのは「階層関係」があると考えるからでしょう。同じインタフェースを実装するだけで互いに何の関係もないクラスについて、インタフェースに実装されたメソッドを一括で呼出したいというのが課題だと思われます。
// ActionScript 3.0クラス定義: Main
package {
	import flash.display.Sprite;
	import flash.events.Event;
	public class Main extends Sprite {
		public const UPDATA:String = "updata";
		public function Main() {
			new Parent(this);
			dispatchEvent(new Event(UPDATA));
		}
		public function addListener(listener:IUpdata):void {
			addEventListener(UPDATA, listener.updata);
		}
	}
}

// ActionScript 3.0クラス定義: Parent
package {
	import flash.display.Sprite;
	import flash.events.Event;
	public class Parent extends Sprite implements IUpdata {
		public var child:Child;
		// public function Parent():void {
		public function Parent(caller:Main):void {
			child = new Child();
			caller.addListener(this);
			caller.addListener(child);
		}
		/* INTERFACE IUpdata */
		// public function updata():void {
		public function updata(eventObject:Event):void {
			trace("parent");
		}
	}
}

// ActionScript 3.0クラス定義: Child
package {
	import flash.display.Sprite;
	import flash.events.Event;
	public class Child extends Sprite implements IUpdata {
		public function Child():void {
		}
		/* INTERFACE IUpdata */
		// public function updata():void {
		public function updata(eventObject:Event):void {
			trace("child");
		}
	}
}

どうでもいいことですけど、"updata"という英単語はありません。ご承知のうえでつけたのでしたら構いませんが、気づかないまま実装すると後で直すのはやっかいですので。


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

tenuki
Åê¹ÆNo.45743
投稿日時: 2010-9-13 14:50
新米
居住地:
投稿: 13
使用環境:
WinXP,FlashCS3
Re: インターフェースでの一括呼び出し、、?!
オブジェクト指向に自身ないですが、
親が子を知っているだけになっていると思います。
親が子を更新する責任を持っても良いかもしれません。
たぶんやりたいことはCompositeパターンのようなことだと思います。
Compositeパターンはファイルとフォルダのような関係を構築できます。
mydoc.printを呼び出すとマイドキュメントに含まれる全てのファイルとフォルダを出力してくれます。
↓それっぽく書いてみたつもりですが、検索してちゃんとした例を探してみてください。

package
{
	import flash.display.Sprite;

	public class Main extends Sprite
	{
		public function Main():void
		{
			var fishing = new Parent("フィッシング");
			fishing.addChild( new Child("磯釣り"));
			fishing.addChild( new Child("サビキ釣り"));
			
			var lure = new Parent("ルアー");
			lure.addChild( new Child("バス釣り"));
			lure.addChild( new Child("シイラ釣り"));
			
			fishing.addChild( lure );
			
			var manga = new Parent("漫画");
			
			var jump = new Parent("週間少年ジャンプ");
			jump.addChild( new Child("ドラゴンボール"));
			jump.addChild( new Child("北斗の拳"));
			
			manga.addChild( jump );
			
 			var sunday = new Parent("週間少年サンデー");
 			var magazine = new Parent("週間少年マガジン");
			manga.addChild( sunday );
			manga.addChild( magazine );
			
			var hobby = new Parent("趣味");
			
			hobby.addChild( fishing );
			hobby.addChild( manga );
			
			var mydoc = new Parent("マイドキュメント");
			mydoc.addChild( hobby );
			mydoc.addChild( new Parent("仕事"));
			mydoc.addChild( new Parent("家計簿"));
			mydoc.addChild( new Parent("音楽"));
			
			mydoc.print();
		}
	}
}

interface Print
{
	function print( str:String = ""):void;
}

class Child implements Print
{
	protected var name:String;
	
	public function Child( name:String ):void
	{
		this.name = name;
	}
	
	public function print( str:String = ""):void
	{
		trace( str + "/" + name );
	}
}

class Parent extends Child
{
	protected var children:Array;
	
	public function Parent( name:String ):void
	{
		super( name );
		
		children = new Array();
	}

	public function addChild( child:Child ):void
	{
		children.push( child );
	}
	
	public override function print( str:String = "" ):void
	{
		if( children.length != 0 )
		{
			for each( var child in children )
			{
				child.print( str + "/" + name );
			}
		}
		else
		{
			super.print( str );
		}
	}
}
pizza
Åê¹ÆNo.45801
投稿日時: 2010-9-15 3:59
新米
居住地:
投稿: 24
使用環境:
MAC バージョン10.5.8

FLASH CS3

AS3.0

Firefox 3.5.2
Safari 4.0.3
Re: インターフェースでの一括呼び出し、、?!
野中様
tenuki様

ご返信ありがとうございます。

返信遅くなってしまいもうしわけございません。。



updataの単語のご指摘ありがとうございます。
お恥ずかしい。。


お2人方に教えていただいやり方を参考に、
自分で納得のいくようよう勉強させていただきます。



野中様のおっしゃるとおり、課題をしっかりしぼって勉強してみます。
インタフェースに実装されたメソッドを一括で呼出すときの最善の方法を試していきたいと思います。



tenuki様に教えていただいたCompositeパターンというパターンを調べると、たしかに自分のしたかったことに近いものでした!
載せていただいたソースを参考にさせて頂きます!




また改めてソースとともに勉強した結果をご返信できたらなと思います!

本当にありがとうございます!!










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

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