我有以下课程方案。
National
ArrayList
Zone
,Zone
ArrayList
Region
,Region
ArrayList
} Person
。
所以我有下一个问题:
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,但我无法弄清楚什么是正确的,哪些是错的。
感谢。
答案 0 :(得分:1)
根据您的类图,Person
必须始终是Region
的成员,即National
或Zone
不能直接包含Person
1}}下面没有包含的对象。
在这种情况下,匹配签名Region
的方法只能在addPerson(Person p)
中出现。如你所说,那你就得做
Region
没有合理的理由可以说,
national.getZone(i).getRegion(j).addPerson(person);
因为National#addPerson(Person p)
没有关于此人所属的National
和Zone
的信息。
但是,您可以向Region
和National
添加便捷方法,如您所说,“推”一个人,但只有在您提供必要的数据时才会这样做。
Zone
National#addPerson(ZoneId zid, RegionId rid, person) { ...
和ZoneId
替换您用于查找RegionId
内的区域和区域的任何密钥类型。
National
如上所述Zone#AddPerson(RegionId rid, person) { ...
。
这只是一个开始,您必须考虑诸如在RegionId
电话中找不到ZoneId
和/或RegionId
时会发生什么等问题。在此设计中,唯一可行的选择是抛出异常,因为此时您没有足够的信息来实例化addPerson(...)
或Zone
。
编辑:
如果您在评论中指出,Region
对象包含足以识别Person
和Zone
的信息,那么Region
和{{1}中的便捷方法可以执行所需的查找并委托给链中的下一个National
。