2013-05-20 106 views
0

我有一個Shape超類和NestedShape子類。 NestedShape子類具有嵌套在其中的Shapes的ArrayList('ShapesList')。我需要爲NestedShape實施「包含」方法。此方法在給出Shape對象時,應檢查NestedShapeShapeList中是否存在形狀。我目前的實現非常簡單:只需在ShapesList上調用ArrayList .contains()方法即可。Java - 替代instanceof?

但是,我需要實現的'contains'方法還必須檢查ShapesList中的任何NestedShape,該形狀的ShapeList也不包含正在搜索的形狀。這樣做的最明顯的方法是使用instanceof來檢查ShapeList中的每個Shape是否爲NestedShape。然後,如果它是NestedShape,我想我會遞歸地調用它的'contains'方法。但是,我不確定這是否是一個好的方法 - 我聽說使用instanceof令人不悅(同時,我不確定我的想法是否使用遞歸甚至可以)。

任何人都可以提出一個更好的方法來解決這個問題?

謝謝:)

+0

可能是兩個單獨的列表?也許一些並行數組(列表)。 – Nikki

+1

代碼使事情變得更加清晰。請張貼一些關於你想要做的事情的片段。 – mtk

回答

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; 
    } 
} 
+0

謝謝!這似乎是一個很好的解決方案。 –

1

兩個想法:

  1. 不要讓NestedShape延長Shape,但seperately處理它們。

  2. 讓所有Shape爲'嵌套'。單個形狀總是返回false爲。

1

如果

  • 的方法的性能是您的關心和
  • NestedShape是不可改變的意義嵌套Shape實例列表設置後不會改變

然後我會提出一個稍微不同的方法。

相反的遞歸迭代雖然所有的NestedShapes您可以添加一個Set,將引用存儲所有NestedShape情況下,這就是它可以訪問此Shape實例Shape類中。