簡體   English   中英

Java的。 抽象元素列表。 如何確定元素類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM