【问题标题】:flash as3 call function in one child class from another child class在另一个子类的一个子类中闪烁 as3 调用函数
【发布时间】:2011-12-01 21:50:51
【问题描述】:

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

树.as

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

Circle.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
    } 
  }
}

楔形.as

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);
    }
  }
}

我在这里看到了一个类似的问题:

How to call a function in a Class from another Class?

但这与我的问题有关,因此有点难以理解。其中一种解决方案有效,但被评论为错误的形式,而另一种则无效,因此我想确保我的代码结构正确。

【问题讨论】:

    标签: flash actionscript-3 class singleton


    【解决方案1】:

    通常父类知道它的子类是可以的,但反过来就不行。如果你不遵循这个原则,你最终会创建Circular dependencies 并最终得到紧密耦合且难以维护的代码。那么关键是防止孩子需要直接调用其父母的方法。

    一种解决方案是使用event-based communication。当子类发生某些事情时,它会触发一个父类可以选择处理或不处理的事件。

    例如:

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

    【讨论】:

    • 您可能希望从 Wedge 类调度一个自定义事件并捕获它。所以在“handleWedgeClick”函数内部,只需调用“this.dispatchEvent(new Event(“wedgeClick”));”然后监听“wedgeClick”而不是 MouseEvent.CLICK。
    • @panupan - 问题是我需要听楔形对象内部的点击,而不是楔形本身。
    • 您好,在这种情况下,您需要使用事件冒泡。这允许事件在视图层次结构中实际“冒泡”。它是响应者链设计模式的一种实现,其中消息沿着链(在本例中为视图层次结构)传递,从而为每个对象提供了在传递之前处理它的机会。看看这个简单的例子来了解一下:blog.152.org/2009/11/flash-actionscript-3-event-bubbling.html
    • 啊 - 这就是问题所在 - 我使用 stopPropagation() 禁用了冒泡(我认为) - 因为它会将 eventListeners 带到嵌套在我不想要的剪辑中的剪辑。感谢您的帮助...现在尝试了解冒泡。
    【解决方案2】:

    只需将wedgeClickHandler 附加到Circle 类中的wedge 成员——它会很好地接收MouseEvent,并且可以直接访问私有函数。

    【讨论】:

    • 如果我这样做 - 一,我真的不喜欢与楔形相关的东西在圆形类中,二 - 它无法识别我的楔形上的点击动作。实际的类构建了一个剪辑,并将该剪辑添加到圆圈中 - 所以我假设我需要以某种方式引用类中的剪辑,对吗?但我不知道该怎么做。
    • @mheavers,你的Circle 类正在实例化Wedge,它负责管理Wedge 实例;最好将Wedge 向上绑定到Circle。如果你想变得更复杂,接口和工厂是一个可能的解决方案;但在你的情况下这可能是矫枉过正?
    • 一个 - 您正在对楔形内的事件做出反应,但您正在停用 圆圈。这样做完全没问题,因为楔形不需要知道任何关于其父类的信息,而且楔形无论如何都是圆的成员。二 - 你的圈子应该有一个private var wedge:Wedge,否则它会被丢弃。另一方面,如果您使用事件侦听器,则 Wedge 不需要对圆的引用。
    • 嘿 - 你的解决方案是有道理的,它只是不适合我 - 我没有收到任何错误,但我的听众没有注册任何活动。我正在修改我的问题以显示更多我的实际代码,以便您了解发生了什么。
    • @Panupan 的解决方案包含正确的代码 - 不要试图让它变得太复杂,点击事件工作所需的只是一个圆形和一个楔形。一旦您了解了事件和侦听器,您就可以继续添加更多层次结构级别,但尽量将第一项任务保持在最低限度。
    【解决方案3】:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 2020-12-26
    相关资源
    最近更新 更多