[英]Java. Abstract elements list. How to determine element type
我有基本的抽象類:
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類的子級列表中,也就是說,我可以對這些組進行分組,這些組也可以擁有自己的組,每個組也可以具有line元素,但是我無法確定該子級是否元素是組或線。 如何確定元素是“組”還是“線”?
instanceof
運算符或比較object.getClass()
對象。 但是檢查對象的具體類型不是一個好習慣。 您應該僅依靠公共界面(您的Graphic
)
使用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
提供任何實現,請使用接口代替抽象類(一個類只能繼承一個類,但可以實現多個接口)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.