2013-11-25 3 views
1

Я работаю в лаборатории для школы, и у меня она почти завершена, но есть одна часть, с которой я не могу работать. Наследование работает, за исключением случаев, когда я попадаю в Cube. По какой-то причине он не будет вычислять Area или Volume (он просто появляется с 0). Я думаю, что это проблема с тем, как у меня есть наследование от Square to Cube. Помощь была бы потрясающей!Многоуровневое наследование не работает

package InheritanceTest; 

import javax.swing.JOptionPane; 

public class InheritanceTest { 

    public static void main(String[] args) { 
     String input = ""; 
     Point point = new Point(); 

     input = getinput("Set variable X"); 
     point.setx(input); 
     input = getinput("Set variable Y"); 
     point.sety(input); 
     System.out.println("Point, x = " + point.getx() + " y = " + point.gety()); 

     Square square = new Square(); 
     input = getinput("Set variable Side Length"); 
     square.setSideLength(input); 
     System.out.println("Square, x = " + point.getx() + " y = " + point.gety() 
       + " Area = " + square.getAreaOfSquare() + " Perimeter = " 
       + square.getPerimeterOfSquare()); 

     Cube cube = new Cube(); 
     input = getinput("Set variable depth"); 
     cube.setDepth(input); 
     System.out.println("cube, x = " + point.getx() + " y = " + point.gety() 
       + " Depth = " + cube.getDepth() + " Area = " + cube.getAreaOfCube() 
       + " Volume = " + cube.getVolumeOfCube()); 
    } 

    private static String getinput(String string) { 
     String x = JOptionPane.showInputDialog(string); 
     return x; 
    } 
} 
package InheritanceTest; 

public class Cube extends Square { 

    private int depth; 

    Cube() { 
     super(); 
     depth = 0; 
    } 

    Cube(int x, int y, int sideLength, int d) { 
     super(x, y, sideLength); 
     this.depth = d; 
    } 

    public int getAreaOfCube() { 
     return (6 * sideLength * sideLength); 
    } 

    public int getVolumeOfCube() { 
     return (sideLength * sideLength * sideLength); 
    } 

    public String getDepth() { 
     return Integer.toString(depth); 
    } 

    public void setDepth(String i) { 
     depth = Integer.parseInt(i); 
    } 
} 
package InheritanceTest; 

public class Point { 

    private int x; 
    private int y; 

    Point() { 
     x = 0; 
     y = 0; 
    } 

    Point(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 

    public String getx() { 
     return Integer.toString(x); 
    } 

    public String gety() { 
     return Integer.toString(y); 
    } 

    public void setx(String input) { 
     x = Integer.parseInt(input); 
    } 

    public void sety(String input) { 
     y = Integer.parseInt(input); 
    } 
} 
package InheritanceTest; 

public class Square extends Point { 

    protected int sideLength; 

    Square() { 
     super(); 
     sideLength = 0; 
    } 

    Square(int x, int y, int l) { 
     super(x, y); 
     this.sideLength = l; 
    } 

    public int getAreaOfSquare() { 
     return sideLength * sideLength; 
    } 

    public int getPerimeterOfSquare() { 
     return sideLength + sideLength; 
    } 

    public String getSideLength() { 
     return Integer.toString(sideLength); 
    } 

    public void setSideLength(String input) { 
     sideLength = Integer.parseInt(input); 
    } 
} 
+3

'sideLength' всегда будет' 0' в 'Cube' ... – MadProgrammer

+1

, вы вводите в заблуждение длину и глубину вашего кода. – BevynQ

+4

Это плохое использование наследования. Куб - это не тип Квадрата, а Квадрат - не тип Точки. Вы могли бы потенциально использовать класс, такой как Spacial, чтобы представлять вещи, которые имеют место в пространстве, и т. Д. – Vitruvius

ответ

2

При создании куба (новый куб()) вы не устанавливать длину стороны (или х и у) на площади объекта она расширяется.

Cube(){ 
    // This is the constructor called. 
    super(); 
    depth = 0; 
} 

Cube(int x, int y, int sideLength, int d){ 
    super(x, y, sideLength); 
    this.depth = d; 
} 

Вы, вероятно, хотите извлечь значения х, у и длины в переменные и использовать «новый куб (х, у, длина, глубина)»

Что-то вроде следующего

String x = getinput("Set variable X"); 
    String y = getinput("Set variable Y"); 
    String sideLength = getinput("Set variable Side Length"); 
    String depth getinput("Set variable depth"); 

    Cube cube = new Cube(x, y, sideLength, depth); 
+0

Единственное, что x и y отображаются до наследования. Единственное, о чем я сейчас думаю, это то, что метод неправильный. Попытайтесь предложить MadProgrammer. –

+0

x и y не относятся к вашей ошибке, но длина линии используется в getVolumeOfCube() и getAreaOfCube(). Его никогда не устанавливают, потому что конструктор суперкласса для Square вызывается только с пустыми аргументами, когда вы вызываете новый Cube(). – Ren

+0

Я не понимаю, почему он не работает ... Наследование для x и y работает. (только потому, что я говорю это снова, потому что если возникла проблема с наследованием, то это не показалось бы) Почему не отображается SideLength? Я просто хочу понять ради знания. Как это пустые аргументы? И что мне нужно сделать, чтобы он работал? –

0

Посмотрите, как вы определяете getVolumeOfCube(). Вы вычисляете объем с помощью sideLength, но никогда не устанавливаете sideLength для любого ненулевого значения. Измените sideLength на глубину, и вы получите нужное значение.

Смежные вопросы