0

我有基本的抽象类:

 abstract class Graphic 
 {
 abstract void draw(Graphics g);
 }

我有 Group 类,它有助于将元素分组到特定的组中。请注意,这个 Group 类内部可以有其他 Group 元素。

 class Group extends Graphic
 {
     private ArrayList<Graphic> children = new ArrayList<Graphic>();
 public ArrayList<Graphic> getChildren() 
 {
      return children;
 }

 public void setChildren(ArrayList<Graphic> children) 
 {
          this.children = children;
 }

 public void draw(Graphics g)
 {
     for(Graphic child:children)
     {
          child.draw(g);
     }
 }
 }

这是也扩展了 Graphic 的 line 类。

 class Line extends Graphic  {
     private Point startPoint = new Point(0,0);
 private Point endPoint = new Point(1,1);

 public void draw(Graphics g) 
 {
     g.drawLine(startPoint.x, startPoint.y, endPoint.x, cendPoint.y);
 }
 }

我可以将 Line 元素或另一个 Group 元素添加到 Group 类子列表中,即我可以对组进行分组,这些组也可以有自己的组,每个组也可以有 line 元素,但是我无法确定孩子是否元素是组或线。如何确定元素是组还是线?

4

2 回答 2

2

使用instanceof或反思:

public void draw(Graphics g) 
{
   for(Graphic child:children)
   {
      child.draw(g);

      if (child instanceof Line) {
         System.out.println("child is of type Line");
      }

      System.out.printf("child is of type %s%n", child.getClass());
   }
 }

但是除了调试之外你不应该需要它。如果你这样做,你最好再次检查你的设计。

还有几件事:

  • 不要使用ArrayListexcept 来指定实现,List而是使用(这允许LinkedList通过更改单行来切换实现)
  • 如果Graphics不提供实现,使用接口代替抽象类(一个类只能继承一个类,但可以实现多个接口)
于 2013-11-11T12:38:00.850 回答
2

instanceof运算符或比较object.getClass()对象。但是检查对象的具体类型并不是一个好习惯。你应该只依赖于公共接口(你的Graphic

于 2013-11-11T12:33:26.023 回答