gpt4 book ai didi

oop - 如何解决OOP中的交叉引用?

转载 作者:行者123 更新时间:2023-12-04 21:01:05 24 4
gpt4 key购买 nike

我现在遇到了几次,我想知道解决循环引用的 OO 方法是什么。我的意思是,A 类将 B 类作为成员,而 B 类又将 A 类作为成员。

一个例子是 Person 类,它的成员是 Person 配偶。

Person jack = new Person("Jack");
Person jill = new Person("Jill");
jack.setSpouse(jill);
jill.setSpouse(jack);

另一个示例是将其他产品的一些集合作为成员的产品类。例如,该集合可能是对这个产品感兴趣的人也可能感兴趣的产品,我们希望在每个产品的基础上维护该列表,而不是基于相同的共享属性(例如,我们不想只显示同一类别中的所有其他产品)。
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);

(这些产品只是为了说明问题,问题不在于某些产品是否相互关联)

一般来说,这会是 OOP 中的糟糕设计吗?所有 OOP 语言都会/应该允许这样做,还是只是不好的做法?如果这是不好的做法,那么解决这个问题的最好方法是什么?

最佳答案

你给出的例子(对我来说,无论如何)是合理的面向对象设计的例子。

您描述的交叉引用问题不是任何设计过程的人工制品,而是您表示为对象的事物的现实特征,所以我认为没有问题。

您遇到过哪些让您觉得这种方法设计不佳的事情?

3 月 11 日更新:

在缺乏垃圾收集的系统中,显式管理内存管理,一种常见的方法是要求所有对象都有一个所有者——其他一些负责管理该对象生命周期的对象。

一个例子是Delphi的TComponent类,它提供级联支持——销毁父组件,所有拥有的组件也被销毁。

如果您正在研究这样的系统,则此问题中描述的引用循环类型可能被认为是糟糕的设计,因为没有明确的所有者,也没有一个对象负责管理生命周期。

我在某些系统中看到的处理方式是保留引用(因为它们正确捕获了业务问题),并添加了一个显式 TransactionContext 对象,该对象拥有从数据库加载到业务域中的所有内容。此上下文对象负责了解需要保存哪些对象,并在处理完成时清理所有内容。

关于oop - 如何解决OOP中的交叉引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/613801/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com