我现在遇到过这种情况,我想知道解决循环引用的OO方法是什么.我的意思是,A类将B类作为成员,B又将A类作为成员.
这方面的一个例子是具有Person配偶作为成员的类Person.
Person jack = new Person("Jack");
Person jill = new Person("Jill");
jack.setSpouse(jill);
jill.setSpouse(jack);
Run Code Online (Sandbox Code Playgroud)
另一个例子是Product类,它将一些其他产品的集合作为成员.该集合可以是例如对该产品感兴趣的人可能也感兴趣的产品,并且我们希望在每个产品基础上维护该列表,而不是在相同的共享属性上(例如,我们不希望仅显示)同类别中的所有其他产品).
Product pc = new Product("pc");
Product monitor = new Product("monitor");
Product tv = new Product("tv");
pc.setSeeAlso({monitor, tv});
monitor.setSeeAlso({pc});
tv.setSeeAlso(null);
Run Code Online (Sandbox Code Playgroud)
(这些产品只是为了说明问题,问题不在于某些产品是否相互关联)
这在OOP中总体上是不好的设计吗?所有OOP语言是否/应该允许这样做,还是只是不好的做法?如果这是不好的做法,解决这个问题最好的方法是什么?
这不是面向对象设计中的基本问题。它可能成为问题的一个例子是在图形遍历中,例如,找到两个对象之间的最短路径 - 您可能会陷入无限循环。但是,您必须根据具体情况进行考虑。如果您知道在这种情况下可能存在交叉引用,请编写一些检查代码以避免无限循环(例如,维护一组已访问的节点以避免重新访问)。但是,如果没有理由它可能成为问题(例如您在问题中给出的示例),那么拥有这样的交叉引用一点也不坏。在许多情况下,正如您所描述的,这是解决当前问题的一个很好的解决方案。