gpt4 book ai didi

java - 实现封装的正确方法

转载 作者:行者123 更新时间:2023-11-30 10:45:51 25 4
gpt4 key购买 nike

我有以下类方案。

enter image description here

National 有一个 ZoneArrayListZone ArrayList RegionRegion 有一个 ArrayListPerson

所以我有下一个问题:

1) 我可以通过国家和地区“插入”一个人将其添加到地区吗?

例如:

National national = new National();
....
national.addPerson(person); // Every level has his own addPerson method

national.getZone(i).getRegion(i).addPerson(person);

在 OOP 中执行此操作的正确方法是什么?

2) 可以制作一个方法让我返回关卡中的每个人吗?

我的意思是例如:

Zone zone = new Zone();
...
zone.getPersons(); //Return a ArrayList with the persons of every Region in Zone.

这不利于封装?

3) 每个级别的 next()、hasNext()、first() 方法,因此我可以在该特定级别进行迭代。

就是这样。我总体上了解封装和 OOP,但我无法弄清楚什么是正确的,什么是错误的。

谢谢。

最佳答案

给定您的类图,Person 必须始终是 Region 的成员,即 NationalZone 不能直接包含未包含在其下的 Region 中的 Person 对象。

在这种情况下,匹配签名 addPerson(Person p) 的方法只能出现在 Region 中。正如您所指出的,那么您将不得不做

national.getZone(i).getRegion(j).addPerson(person);

没有合乎逻辑的理由,比如说,

National#addPerson(Person p)

因为 National 没有关于此人属于哪个 ZoneRegion 的信息。

但是,您可以向 NationalZone 添加方便的方法,正如您所说,“推”一个人,但前提是您提供必要的数据.

National#addPerson(ZoneId zid, RegionId rid, person) { ...

对于 ZoneIdRegionId,替换您用来在 National 中查找区域和区域的任何键类型。

Zone#AddPerson(RegionId rid, person) { ...

如上RegionId

这只是一个开始,您必须仔细考虑诸如当 ZoneId 和/或 RegionIdaddPerson 上找不到时会发生什么的问题(...) 调用。在此设计中,唯一可行的选择是抛出异常,因为此时您没有足够的信息来实例化 ZoneRegion

编辑:

如果正如您在评论中指出的那样,Person 对象包含足够的信息来识别 ZoneRegion,那么您的便捷方法NationalZone 可以执行所需的查找并委托(delegate)给链中的下一个 addPerson(Person p)

关于java - 实现封装的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36831194/

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