嘿,这个问题是对Joel Hooks对我的一个较旧问题的评论的回复(How to call a function in a Class from another Class?)
我能够使用公共静态var修复我自己的问题来引用我的一个类,所以在另一个类中我只需要使用this关键字就可以调用它。
instance = this; // in Navigation Class
Navigation.instance.introPlayButtonClick(); // in Intro Class
现在看来我不是用 OOP 的最佳或纯粹主义方式做这件事(可以在这里看到辩论),所以我提出这个问题的第二个问题希望能够正确理解这一点的时间。
我有2个类,简介和导航。在Intro类中创建了一个按钮,需要调用Navigation类中的函数。我还有一个CustomEvent类,我在其中设置自定义事件。下面是代码,我已经删除了与此问题相关的所有不必要的代码。
当调用单击功能时,它会调度Navigation类正在侦听的事件。
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 Class需要能够调用的函数。
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?
答案 0 :(得分:4)
通常,容器的责任是调用其子函数。
如果你想让(或其他独立的)兄弟姐妹互相交流,你的容器就会充当两者之间的代理人。
例如,如果您的应用程序结构如下:
container
|
+-- introInstance
|
+-- navigationInstance
container
为CustomEvent.INTRO_CLICKED
上的introInstance
事件添加了一个监听器。
introInstance
举起CustomEvent.INTRO_CLICKED
事件。
在container
的事件处理程序中调用navigationInstance.introPlayButtonClick()
。
通过这种方式,您的Intro
课程不需要知道有关您的Navigation
课程的任何内容,反之亦然,您的container
会形成两个实例之间的粘合剂。“ p>
快速注意:container
不必是文字DisplayObjectContainer,其显示列表中包含两个项目,只需要引用两个实例并知道如何处理它们。
答案 1 :(得分:1)
Errr ..我能想到的唯一方法就是将你的Intro类扩展到Navigation类,以使其正常工作。
像...这样的东西。
public class Intro extends Navigation {}