0

我有一个Shape超类和一个NestedShape子类。子类有一个嵌套在其中的NestedShapeArrayList (' ShapesList') 。Shapes我需要为NestedShape. 当给定一个Shape对象时,此方法应检查该形状是否存在于NestedShape'sShapeList中。我现在的实现非常简单:只需调用 ArrayList.contains()方法ShapesList

但是,我需要实现的“包含”方法还必须检查 中的任何NestedShape形状ShapesList,该形状ShapeList也不包含正在搜索的形状。对我来说这样做的明显方法是使用instanceof检查其中Shape的每个ShapeList是否都是NestedShape. 然后,我想如果它是一个NestedShape. 但是,我不确定这是否是一种好方法——我听说使用 ofinstanceof不受欢迎(另外,我不确定我使用递归的想法是否可行)。

任何人都可以提出更好的方法来解决这个问题吗?

谢谢 :)

4

3 回答 3

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;
    }
}
于 2013-05-20T07:42:12.147 回答
1

如果

  • contains()方法的性能是您关心的问题,并且
  • NestedShape是不可变的,这意味着嵌套Shape实例列表一旦设置就永远不会改变

那么我会建议一种稍微不同的方法。

您可以在类中NestedShapes添加一个而不是递归迭代所有这些,该类将存储对可以访问此实例的所有实例的引用。SetShapeNestedShapeShape

于 2013-05-20T08:19:20.517 回答
1

两个想法:

  1. 不要让NestedShapeextend Shape,而是单独处理它们。

  2. 让所有Shapes 都“嵌套”。false总是返回单个形状contains()

于 2013-05-20T07:46:37.150 回答