我有一个Shape
超类和一个NestedShape
子类。 NestedShape
子类具有嵌套在其中的ShapesList
的ArrayList('Shapes
')。我需要为NestedShape
实现'包含'方法。当给定Shape
对象时,此方法应检查NestedShape
的{{1}}中是否存在该形状。我现在的实现非常简单:只需在ShapeList
上调用ArrayList .contains()
方法。
但是,我需要实现的“包含”方法还必须检查ShapesList
中的任何NestedShape
,该形状的ShapesList
也不包含正在寻找。这样做的显而易见的方法是使用ShapeList
检查instanceof
中的每个Shape
是否为ShapeList
。然后,我猜我会递归调用我的'contains'方法,如果它是NestedShape
。但是,我不确定这是否是一个很好的方法 - 我听说NestedShape
的使用是不受欢迎的(同样,我不确定我使用递归的想法是否会起作用)。
有人能提出更好的方法来解决这个问题吗?
谢谢:)
答案 0 :(得分:5)
使用多态:
public class Shape {
public boolean contains(Shape shape) {
return false;
}
}
public class NestedShape extends Shape {
private List<Shape> subShapes = new ArrayList<Shape>();
@Override
public boolean contains(Shape shape) {
if (subShapes.contains(shape)) {
return true;
}
for (Shape subShape : subShapes) {
if (subShape.contains(shape)) {
return true;
}
}
return false;
}
}
答案 1 :(得分:1)
两个想法:
不要让NestedShape
延长Shape
,而是单独处理它们。
让所有Shape
成为'嵌套'。对于false
,单个形状的返回始终为contains()
。
答案 2 :(得分:1)
如果
contains()
方法的表现是您的关注点和NestedShape
是不可变的,这意味着一旦设置的嵌套Shape
实例列表永远不会改变然后我建议采用略有不同的方法。
不是递归迭代所有NestedShapes
,而是可以在Set
类中添加Shape
,它将存储对所有NestedShape
实例的引用。可以访问此Shape
实例。