代码之家  ›  专栏  ›  技术社区  ›  Pup

是否从子级调用addChild()?孩子们自己添加?

  •  1
  • Pup  · 技术社区  · 15 年前

    使用ActionScript3.0中的显示列表,我经常倾向于让孩子们将自己添加到他们的父母中,因为他们通常已经有了那个引用。看起来像是:

    _myParent.addChild(this);

    或者删除时…

    this.parent.removeChild(this);

    addChild() 语法,这种方式似乎是向后的--名称表明 起源 应该是唯一调用该函数的。

    • 还有人这样做吗?
    • 或者这看起来是向后的和混乱的?
    • 也许我让自己陷入了不该陷入的境地?

    看起来像是 违反职责 因为父级应该是唯一一个调用 它自己 方法和负责 它自己 显示列表。

    4 回复  |  直到 15 年前
        1
  •  1
  •   Luke Bayes    15 年前

    当一个孩子提到他的父母时,你会很小心的。虽然它不会破坏任何与对象方向相关的规则,但它确实开始 Composite 结构更难维护和理解。

    ActionScript3.0中的显示列表设计用于在与子级交互时使用方法调用,以及每当子级执行对父级可能感兴趣的操作时使用事件(有时是冒泡)。

    这个方向帮助我们让孩子们不知道他们在层次结构中的位置,并将他们设计得更像通用(可重用)组件。通常,当操作脚本显示列表从父级移动到子级时,它会从更具体的移动到更不具体的。例如,creditcardform可能包含一个textinput控件。

        2
  •  0
  •   Amarghosh    15 年前

    虽然这不是一个好的做法, this.parent.removeChild(this); 有时是方便的(取决于你的设计)-我记得在早期的AS编码…然后我被告知这不是一个好的方法,我不再使用它。

    关于 _myParent.addChild(this); --我通常不会将父对象传递给子对象的构造函数/方法…我认为这种做法根源于AS2。是的,它看起来很奇怪/令人困惑,因为它不是AS3方式。

        3
  •  0
  •   Yaroslav Yakovlev    15 年前

    我觉得这很糟糕,因为父母的状况是这样的 s children. So by having reference to child you can change parent 它破坏了封装。

    当需要实现拖放时,让我们考虑一个简单的例子。可以这样做:

    1. 告诉孩子把他从父母身边带走。然后告诉孩子将他添加到新家长中。父母甚至不知道这一点。

    2. 告诉父母-我需要你的孩子。他会把那个孩子带走的。然后告诉其他家长:从现在起这个孩子就是你的了。

      第二种方法对我来说更合理,因为如果你需要拒绝一些孩子(家长可以 t have some types of children, or need to do some actions when you are getting new children, like prepare a bedroom, or buy some toys), you 这一切都得从你孩子的课堂上讲出来。这将需要显示您的所有家长 s implementation for that. Sure it can be done via generic interface of parent, but I think it 更容易把这个责任委托给父母并提供孩子。每个家长都知道他应该怎么做才能添加这个孩子。

        4
  •  0
  •   Pup    15 年前

    _myParent.addChild(this);

    让我们把这个分解…

    • _myParent
      这是对另一个对象的引用,该对象恰好是显示列表中该对象的父对象。对象引用其父对象有很多原因。它们在结构上是密切相关的,因此可能有理由相互交流。因此,引用显示列表父级并不是问题。

    • addChild()
      调用父级的公共方法之一不是问题。这就是方法的目的。如果这是父母的财产,它将是侵入性的。调用此方法不会直接更改父级的状态。母公司将自行执行该职能。

    • this
      这种情况下的论点恰好是自指性的,这是一个巧合。如果争论是微不足道的,比如 new Shape() 看起来不那么尴尬。但是,由于一个对象本质上是“添加自身”,它看起来就像一个人用他的/她的鞋带把自己举起来。但是,这不是真实的生活;这是计算机编程,用它的语法来读是有意义的。

    需要ActionScript来命名函数 某物 . 另一种让孩子进入显示列表的方法是 addToParent() 当试图从父级添加子级时,仍然会产生同样的尴尬效果-- _myChild.addToParent(this) .

    因此,虽然在这种尴尬的困境中没有任何对象被侵犯,但有一种更自然的写作方式 Advess() 语句,这是为了添加子项 来自父母 而不是相反,因为这是语法规定的顺序。所以,试着用自然的方法,如果失败了,另一种方法还是可以的,只是有点尴尬。