0

ちょっとこの質問は、私の古い質問に対するJoel Hooksのコメントへの返信です ( How to call a function in a Class from another Class? )

public static var を使用して自分のクラスの 1 つを参照することで、自分の問題を解決できたので、他のクラスでは this キーワードを使用して呼び出せるようにするだけで済みました。

instance = this; // in Navigation Class
Navigation.instance.introPlayButtonClick(); // in Intro Class

今、私はこれをOOPの最善または純粋な方法で行っていないようです(ここで議論を感じることができます)ので、これを正しく理解することを期待して、この質問を2回目にします。

問題

Intro と Navigation の 2 つのクラスがあります。Intro クラスで作成されたボタンがあり、Navigation クラス内で関数を呼び出す必要があります。また、カスタム イベントをセットアップする CustomEvent クラスもあります。以下はコードです。この問題に関連する不要なコードはすべて削除しました。

イントロクラス

クリックされた関数が呼び出されると、Navigation クラスがリッスンしている Event が送出されます。


package src.display
{
import flash.events.*;
 import flash.display.*;

 // ☼ --- Imported Classes
 import src.events.CustomEvent;
 import src.model.Navigation;

 public class Intro extends Sprite 
 {
  private var playBtn:MovieClip;
  private var colorTransform:ColorTransform;

  // ☼ --- Constructor
  public function Intro():void 
  {
      this.addEventListener(Event.ADDED_TO_STAGE, init);
  }

  // ☼ --- Init
  public function init(event:Event):void 
  {
      draw();
      this.removeEventListener(Event.ADDED_TO_STAGE, init);
  }

  public function draw():void 
  {
      playBtn = new PlayThumb;
      playBtn.buttonMode = true;   
      playBtn.x = 552;   
      playBtn.y = 289;
      playBtn.alpha = 1;

      // ☼ --- add button 
      addChild(playBtn);

      // ☼ --- button listeners
      playBtn.addEventListener(MouseEvent.MOUSE_UP, clicked);
  }
  //-----------------------------------------------------
  // ☼ --- My Old Function
  /*private function clicked(e:MouseEvent):void 
  {
      Navigation.instance.introPlayButtonClick(); // Open tab1
  }*/
  //-----------------------------------------------------
  // ♦♦♦ Added to dispatch Event to JStriedl's function ♦♦♦
  private function clicked(e:MouseEvent):void 
      {
      dispatchEvent (new CustomEvent(CustomEvent.INTRO_CLICKED, {}));
      trace("Dispatch Event INTRO_CLICKED");
      }
 }
}

ナビゲーション クラス

これは、Intro クラスが呼び出すことができる必要がある関数を含むナビゲーション クラスです。


package src.model 
{
import flash.events.*;
import flash.display.*;

// ☼ ---Imported  Classes
import src.display.Intro;
import src.model.Fonts;
import src.events.CustomEvent;

public class Navigation extends MovieClip //Needs MovieClip
{  
    public var intro:Intro;
    public static var instance:Navigation;

    // ☼ --- Constructor
public function Navigation()
{
    this.addEventListener(Event.ADDED_TO_STAGE, init);
}

// ☼ --- Init
public function init():void
{
    instance = this;  
    intro = new Intro;
    attachListenerForIntro(intro);
    this.removeEventListener(Event.ADDED_TO_STAGE, init);
}

// ♦♦♦ JStriedl's code ♦♦♦
public function attachListenerForIntro(introToCheckForClick:Intro)
{
    intro = introToCheckForClick;
    intro.addEventListener("introClicked", introPlayButtonClick);
}

// Function that button in Intro needs to call
public function introPlayButtonClick(e:CustomEvent):void
{    
    trace("Navigation function called from Intro");
    intro.removeEventListener("introClicked", introPlayButtonClick);
}
}
}

問題またはエラー

これまでのところ、ボタンをクリックしても何も起こりません:(ナビゲーションクラス内にEventListenerが正しく設定されていないと思いますか?

4

2 に答える 2

4

一般に、子の関数を呼び出すのはコンテナの責任です。

(そうでなければ独立した)兄弟を相互作用させたい場合、コンテナは2つの間のプロキシとして機能します。

たとえば、アプリケーションが次のように構成されている場合:

container
  |
  +-- introInstance
  |
  +-- navigationInstance
  1. containerCustomEvent.INTRO_CLICKEDのイベントのリスナーを追加しintroInstanceます。

  2. introInstanceイベントを発生させCustomEvent.INTRO_CLICKEDます。

  3. containerのイベントハンドラー呼び出しでnavigationInstance.introPlayButtonClick()

このようにして、Introクラスはクラスについて何も知る必要がなくNavigation、その逆も同様containerです。つまり、2つのインスタンス間の接着剤を形成します。

クイックノート:containerは、表示リストに両方の項目があるリテラルDisplayObjectContainerである必要はありません。両方のインスタンスへの参照があり、それらをどう処理するかを知っている必要があります。

于 2009-11-19T02:33:01.927 に答える
1

Errr ..これが適切に機能するためには、IntroクラスをNavigationクラスに拡張することしか考えられません。

何かのようなもの..

public class Intro extends Navigation {}
于 2009-11-18T23:25:34.047 に答える