OO设计问题 - 家长/孩子(通知) - 通函?

Rol*_*ble 15 oop tree class-design data-structures

我对OO设计过程很新,所以请耐心等待....

我有两个实体,我需要建模为类,称为父和子(它足够接近实际的问题域).一位家长将有一个或多个孩子 - 在这个申请中,我对没有孩子的父母没有兴趣.

我的大脑出去吃午饭的地方是我需要能够找到另一个.在我的数据库中,我可以使用正常的外键关系实现它,并且SQL的基于集合的特性使得查找给定父项的所有子项或给定子项的父项变得容易.但作为对象......?

认为家长应携带儿童的集合(列表,无论如何).我还认为每个孩子都应该提及其父母.然而,参考文献的循环性质让我头疼.

我是:

  • 在正确的轨道上?
  • 完全离开基地?如果是这样,我该怎么办?

这几乎肯定会在VB.NET中实现,但我还是可以通过切割代码来实现.

8个答案后编辑:

谢谢大家.很难选择一个接受的答案.

澄清答案中提出质疑的几件事:

  • 父和子是非常不同的实体 - 根本没有继承关系.我选择了我所做的名字,因为它们真的非常接近真实世界的问题领域,现在看来它是从OO角度来看混淆的根源.
  • 层次结构只有一层深度 - 孩子们永远不会在应用程序中拥有子级.

再次感谢.

Joh*_*ica 11

创建树结构时,循环引用很好并且绝对标准.例如,HTML的文档对象模型(DOM)在DOM树中的每个节点上都具有父属性和子属性:

interface Node {
    // ...
    readonly attribute Node     parentNode;
    readonly attribute NodeList childNodes;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

  • 这不是循环参考. (2认同)

wom*_*omp 8

听起来你跟我走在正确的轨道上.根据您的域名模式,父母有子女,孩子有父母.您可能需要从另一个引用每个.

循环引用没有任何问题,你只需要小心你用它们做什么.遇到麻烦的地方是从数据库加载实体时,以自动方式管理服务器端的实体.例如,您使用查询从数据库中获取Child对象.你是否包括父信息?你是否包括父母的孩子?

像Lightspeed或Microsoft的Entity Framework这样的ORM工具通常使用"延迟加载"指令来处理这个问题.他们会首先获取您需要的内容(因此,当您获取Child时,它只会获取Child属性和父级ID).如果稍后,您取消引用Parent,它将获取Parent属性并实例化Parent对象.如果以后仍然访问它的Children集合,则它会获取相关的子信息并为该集合创建Child对象.直到你需要它们,它不会填充它.