我有基本的抽象类:
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?
答案 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而不是抽象类(类只能继承一个类,但它可以实现多个接口)