子链接到父链接-好主意吗?


15

我有一种情况,我的父母知道这是孩子(duh),但我希望孩子能够引用父母。原因是我希望孩子有能力在感觉到自己时将自己指定为最重要或最不重要。当孩子这样做时,它将移动到父母孩子的顶部或底部。

过去,我曾在孩子身上使用WeakReference属性来引用其父对象,但我觉得这增加了一个烦人的开销,但这也许是最好的方法。

这只是一个坏主意吗?您将如何以不同方式实施此功能?

更新1:添加更多上下文。这是一个渲染系统,因此父容器是组合在一起的窗口列表。子项(窗口)说“我最重要!” 希望基本上呈现在其余窗口的顶部。

父母只是将这些孩子分组在一起的逻辑容器。我可以看到在哪里添加事件以表明请求位于顶部是一个好主意。但是除了实现(孩子想与父母做什么)之外,为什么不希望有child-> parent链接?双向链接列表可以做到这一点,这样人们就可以遍历某物。


3
您不需要WeakReference。.net垃圾收集器可以处理周期。如果不再使用该子项(父项未指向该子项),则尽管包含了对父项的引用,也会对其进行收集。
dbkk

如果两个孩子都认为自己想成为最重要的孩子,将会怎样?
btilly 2012年

@btilly最重要的孩子实际上只是将其重新排序到父母的孩子列表中的堆栈顶部。因此,持续执行下去的人变得至关重要。在我的情况下,您永远不会遇到最重要的冲突。
Thraka

Answers:


18

这只是一个坏主意吗?

经常。

  • 它破坏了父级的封装。
  • 它增加了两者的耦合。
  • 它是孩子进入系统其余部分的突破点,并增加了与它附近隐隐约约的事物的耦合(因为人们滥用该参考)
  • 如果您想要没有父母的孩子,它将限制您的设计。

如何做得更好?孩子不应该知道或关心它是否在一个集合中。与其认为自己很重要,不如说它知道某些事情已经发生,所以不管谁在乎(父母),都可以增加其优先级(或孩子所处环境的规则是什么)。我对此并不感到兴奋,并且可能希望更好地将孩子的模型与重要性行为之间的关注点分离开来,但是如果没有更多的上下文背景就无法详细阐述。

[编辑:]

是的,渲染系统是父母所有权的一种情况……好吧,我不想说是有道理的,但这只是其中一种情况,并非世界末日。为了获得控制重点,我仍然更喜欢输入处理程序(或其他任何处理程序)在树上行走并知道要重新排序哪个集合的设计,而不是寻找子项,在子项上调用要去其父项的东西。


1
这是一个很好的答案,您可能应该考虑它提出的所有要点,并查看它们是否适用于您的问题。话虽这么说,但我不认为如果您将参考作为一个简单的实现并在/或事情失控时将其重构就可以了。
rperetti

答案是正确的。但是,如果子链接到父链接不是一个好主意,则面向对象的编程将不再与现实生活中的对象相关。有没有什么办法可以使这成为一件好事?
Manoj R

到目前为止,谢谢您的回答。我在原始问题中添加了更多上下文。
Thraka

1
@ManojR-面向对象的编程从未与现实生活中的对象相关。
Telastyn 2012年

您的编辑使我想到了WPF \ Silverlight中的VisualTreeHelper。这使您可以查询当前控件与其他UI系统控件之间的关系。我想我可以实现这样的事情,因为我还有一个根目录控件可以托管其他所有内容。谢谢!!
Thraka

0

执行力如何达到孩子认为最重要的地步?它通过父母到达那里吗?如果是,则可以将对父方法的引用发送给该方法。

例如。如果所有节点都有某种类似的update()方法

void update() {
    doSomething()
    for(Node n:childs){
        //do something
        n.update();
    }
}

您可以将其更改为

void update(Node parent) {
    doSomething(parent)
    for(Node n:childs){
        //do something
        n.update(this);
    }
}

是的,这是一种很好的方法。但是,在我的情况下,客户端逻辑代码可能不是由父级循环启动的。
Thraka

0

我认为这不是一个坏主意。您可以通过向每个子项添加排序顺序值来解决此问题。我正在构想像“ z-index”之类的东西,用于在网页中彼此上下显示对象。

我不确定您如何编写这样的代码,但是这个概念听起来可行。


使用此解决方案,问题仍然存在。这仅用z-index替换了“按顺序排列”概念。我仍然需要从儿童到父母的交流系统。不过谢谢:)
Thraka
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.