Java的。抽象元素列表。如何确定元素类型

时间:2013-11-11 12:29:04

标签: java oop

我有基本的抽象类:

 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的线类。

 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 class子列表中,也就是说我可以对组进行分组,这些组也可以拥有自己的组,每个组也可以有line元素,但是我无法确定子元素是Group还是Line。如何确定元素是Group还是Line?

2 个答案:

答案 0 :(得分:2)

instanceof运算符或比较object.getClass()对象。 但是检查具体的物体类型并不是一种好的做法。 您应该只依赖公共界面(您的Graphic

答案 1 :(得分: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());
   }
 }

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

更多的事情:

  • 除了指定实现之外,请不要使用ArrayList,而是使用List(这样可以通过更改单行将切换实现说给LinkedList
  • 如果Graphics没有提供实现,请使用interface而不是抽象类(类只能继承一个类,但它可以实现多个接口)