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());
   }
 }

ただし、デバッグ以外では必要ありません。その場合は、もう一度デザインを確認してください。

さらにいくつかのこと:

  • ArrayList実装を指定するために except を使用しないでください。List代わりに使用してください (これによりLinkedList、1 行を変更するだけで実装を切り替えることができます)
  • 実装を提供しない場合Graphicsは、抽象クラスの代わりにインターフェイスを使用します (クラスは 1 つのクラスのみを継承できますが、複数のインターフェイスを実装できます)。
于 2013-11-11T12:38:00.850 に答える