2016-07-03 4 views
0

私は既にJavaで継承のプログラムを書いています。 BoxとLineはShapeのサブクラスで、draw()はShape.in InherPaintクラスの関数です。私はmenu()とdisplay()関数も書きました。ラインを追加したい場合や、ボックスを追加する場合は、結果は問題ありませんが、ラインを追加した後、その追加ボックスの後に結果が間違っている場合は、私は、問題は、私の間違った形状配列の定義と、私がindexShapeBoxとindexShapeLineでそれを使用した方法であると思います。Javaでの継承の練習

package inherpaint; 

    import java.util.Scanner; 

public class InherPaint { 

Scanner key = new Scanner(System.in); 
Shape[] listShape = new Shape[80]; 
int indexShapeBox = 0; 
int indexShapeLine = 0; 

public static void main(String[] args) { 

    InherPaint p = new InherPaint(); 
    p.menu(); 
} 

void display() { 

    System.out.println(" *** Paint System ***"); 
    System.out.println("1.Add box"); 
    System.out.println("2.Add line"); 
    System.out.println("3.Show all"); 
    System.out.println("4.Erase all"); 
    System.out.println("5.Exit"); 

} 

void menu() { 

    int option = 0; 
    while (option != 5) { 

     display(); 
     option = key.nextInt(); 
     switch (option) { 

      case 1: 
       System.out.println(" Please enter a nomber for sizeX : "); 
       int X = key.nextInt(); 
       System.out.println(" Please enter a nomber for sizeY : "); 
       int Y = key.nextInt(); 
       Box b = new Box(X, Y); 
       listShape[indexShapeBox] = b; // problem must be here ! 
       indexShapeBox++; 

       break; 

      case 2: 
       System.out.println(" Please enter a nomber for sizeZ : "); 
       int Z = key.nextInt(); 
       Line l = new Line(Z); 
       listShape[indexShapeLine] = l; // problem must be here ! 
       indexShapeLine++; 

       break; 

      case 3: 
       for (int i = 0; i < indexShapeBox; i++) { 
        listShape[i].draw(); 
       } 

       for (int i = 0; i < indexShapeLine; i++) { 
        listShape[i].draw(); 
       } 

       break; 

      case 4: 
       indexShapeBox = 0; 
       indexShapeLine = 0; 

       break; 

      case 5: 
       System.out.println("Exit!"); 

       break; 

      default: 
       System.out.println("Error"); 

      } 

     } 

    } 

} 

、これはShapeクラスである:私のコードはここにある

package inherpaint; 

    public abstract class Shape { 

     int sizeX,sizeY,sizeZ; 
     public abstract void draw(); 

} 

、これはBoxクラスである:

package inherpaint; 

    public class Box extends Shape { 

     public Box(int sizeX, int sizeY) { 
     this.sizeX = sizeX; 
     this.sizeY = sizeY; 
} 

    @Override 
    public void draw() { 

     for (int i = 0; i < sizeX; i++) { 

      for (int j = 0; j < sizeY; j++) { 
       System.out.print("-"); 

      } 

      System.out.println(); 
     } 
    } 

} 

、これはラインのクラスです:

package inherpaint; 

    public class Line extends Shape { 

     public Line(int sizeZ) { 
     this.sizeZ = sizeZ; 
} 


    @Override 
    public void draw() { 

     for (int j = 0; j < sizeZ; j++) { 
      System.out.print("-"); 

     } 
    } 
} 

誰もが考えていますか?

答えて

1

同じアレイに格納していても、ラインとボックス用に別々のカウンターがあります。それはあなたの問題だ。あなたはただ一つのカウンターが必要です。

このコード考えてみましょう:

 case 1: 
      ... 
      listShape[indexShapeBox] = b; 
      indexShapeBox++; 
      ... 
     case 2: 
      ... 
      listShape[indexShapeLine] = l; 
      indexShapeLine++; 

あなたはボックスを追加して、行を追加する場合はラインリファレンスは、ボックスの参照を上書きするので、彼らは、listShape配列の同じインデックスに追加されます。

にコードを変更し

:あなたの描画ループも簡素化されなければならない

 case 1: 
      ... 
      listShape[indexShape] = b; 
      indexShape++; 
      ... 
     case 2: 
      ... 
      listShape[indexShape] = l; 
      indexShape++; 

 case 3: 
      for (int i = 0; i < indexShape; i++) { 
       listShape[i].draw(); 
      } 
+0

おかげではなく、これらの変更と、それは私がボックスを追加呼び出す場合でも、正しい答えを示していないと別々に行を追加してください! 。 @eran – MarAnd

+0

@ M.ds単一のインデックス変数に切り替えましたか? 1つのボックスと1つの行を追加すると、どのような出力が得られますか? – Eran

+0

はい、あなたが言ったように私はやった。 1行追加するためにsizeZに2を入力しました。出力は次のようになりました:---- @eran – MarAnd