flash as3从另一个子类调用一个子类中的函数

flash as3从另一个子类调用一个子类中的函数,flash,actionscript-3,class,singleton,Flash,Actionscript 3,Class,Singleton,我试图从另一个子类(Wedge.as)调用一个子类(Circle.as)中的函数。Circle.as由文档类(Tree.as)实例化,Wedge.as由Circle.as实例化。我该怎么做?这是我的代码: Tree.as package com.treediagram { public class Tree extends MovieClip { var firstCircle:Circle = new Circle(); addChild(firstCirc

我试图从另一个子类(Wedge.as)调用一个子类(Circle.as)中的函数。Circle.as由文档类(Tree.as)实例化,Wedge.as由Circle.as实例化。我该怎么做?这是我的代码:

Tree.as

package com.treediagram  
{  
  public class Tree extends MovieClip  
  {
    var firstCircle:Circle = new Circle();
    addChild(firstCircle);
  }
}
圆圈.as:

package com.treediagram
{
  public class Circle extends MovieClip  
  {
    private var wedge:Wedge;
    public function Circle()  
    {
      var circleHolder:MovieClip = new MovieClip();
      var circleClip:MovieClip = new MovieClip();
      circleClip.addEventListener(MouseEvent.CLICK,circleClickedEvent);
    }

    private function circleClickedEvent(e:MouseEvent):void
    {
      var wedgeHolder:MovieClip = new MovieClip();
  circleHolderRef.addChildAt(wedgeHolder,1);
      var wedge:Wedge = new Wedge(wedgeHolderRef);
  wedge.addEventListener(MouseEvent.CLICK,wedgeClickEvent);
    }



    private function wedgeClickEvent(e.target){
      trace ('click'); //NOT WORKING
    } 
  }
}
韦奇·阿斯

package com.treediagram
{
  public class Wedge extends MovieClip  
  {
    public function Wedge(wedgeHolderRef)
    {
      var wedgeClip:MovieClip = new MovieClip();
      wedgeClip.addEventListener(Event.ADDED_TO_STAGE, wedgeAddedEvent);
      wedgeHolderRef.addChild(wedgeClip);
    }
  }
}
我在这里看到了一个类似的问题:


但这和我的问题有关,有点难以理解。其中一个解决方案有效,但被评论为形式不好,另一个不起作用,因此我想确保我的代码结构正确。

只需将wedgeClickHandler从Circle类内连接到楔形成员-它将很好地接收MouseeEvent,它可以直接访问私有函数。

您不能调用
Circle.deactivateCircle()
因为它的可访问性被设置为
private
,并且
Wedge
对象需要有一个对
Circle
对象的引用,您要在该对象上调用该方法。

通常,父类可以知道它的子类,但不能反过来。如果不遵循这一原则,您将最终创建并使用紧密耦合且难以维护的代码。关键是防止子对象直接调用其父对象的方法

一个解决方案是使用。当子类中发生某个事件时,它会触发一个事件,父类可以选择是否处理该事件

例如:

public function Circle()  
{
  var wedge:Wedge = new Wedge();
  wedge.addEventListener(MouseEvent.CLICK, onWedgeClick);
}
private function onWedgeClick(e:MouseEvent) {
  deactiveCircle();
}

如果我这样做——第一,我真的不喜欢与楔子相关的东西在circle类中,第二,它不能识别楔子上的点击动作。实际的类构建了一个片段,并且该片段被添加到圆中-所以我假设我需要以某种方式引用类中的片段,对吗?但是我不知道怎么做。@mheavers,你的
类正在实例化一个
楔块
,它负责管理
楔块
实例;最好将
楔块
向上系到
圆圈
。如果你想变得更复杂,接口和工厂是一个可能的解决方案;但在你的情况下,这可能是杀伤力过大了?第一,你是从楔子内部对一个事件做出反应,但你是在破坏这个循环。这样做完全可以,因为wedge不需要知道任何关于其父类的信息,而且wedge是circle的成员。第二,你的圆圈应该有一个
专用var wedge:wedge
,否则它将被丢弃。另一方面,如果您使用事件侦听器,则Wedge不需要对circle的引用。嘿-您的解决方案很有意义,它对我不起作用-我没有收到任何错误,但我的侦听器没有注册任何活动。我正在修改我的问题,以显示更多我的实际代码,以便您可以看到发生了什么。@Panupan的解决方案包含正确的代码-不要试图将其变得太复杂,单击事件只需一个圆和一个楔块即可工作。一旦您了解了事件和侦听器,就可以继续添加更多层次结构级别,但要尽量减少第一个任务。您可能希望从Wedget类中分派一个自定义事件并捕获它。因此,在“HandleEdgeClick”函数中,只需调用“this.dispatchEvent(新事件(“wedgeClick”));”,然后侦听“wedgeClick”而不是MouseeEvent.CLICK。@panupan-问题是我需要侦听wedge对象内部某些内容的单击,而不是wedge本身。您好,在这种情况下,您需要使用事件冒泡。这允许事件在视图层次结构中实际“冒泡”。它是响应者链设计模式的一个实现,其中消息沿着链传递(在本例中为视图层次结构),为每个对象在传递之前提供了处理它的机会。查看这个简单的示例,了解一个想法:啊-这就是问题所在-我禁用了stopPropagation()的冒泡功能(我想),因为它将eventListeners下放到了嵌套在片段中的片段中,而我不想要这些片段。谢谢你的帮助…现在试着去理解冒泡。你实际上没有使用单例,这很好,因为它实际上是一种反模式