Java继承如何获取用户输入并将其传递给子子类?

时间:2014-11-01 16:02:24

标签: java inheritance user-input shape

这是我在这里发表的第一篇文章,请耐心等待!我有一个我需要编写的程序。以下是说明:在该类中创建一个名为areaExcersice的类,您将拥有一个名为shapes的超类,然后在它下面是twoDimensionalShapes,后面是subDimensionalShapes下的子子类circle和square。在circle extends twoDimensionalShapes中,我将传递radius的用户输入,例如:

System.out.print("what is the radius"); 

然后

radius = input.nextDouble()

已经知道如何在层次结构系统中创建和分配类,但是,我不知道我将如何在twiDimensionalShapes下调用我的circle类。我必须创建一个if语句,以便用户可以选择要选择的形状,这样就像这样#34;按1代表圆形,2代表方形"在我的

if(user_input == 1){

这是我的问题,如何在twodDimensionalShapes下调用circle类来查找区域并传递半径?谢谢,这就是我需要知道的一切,如果你能指出我已经为我做了一个实例的好方向

Circle c = new Circle

然后在我的if语句中我会c.getArea()但是那时我会把用户询问的半径放在哪里?

4 个答案:

答案 0 :(得分:0)

您可以移动所有Shape或TwoDimensionalShape子类中常见的任何内容,以便可以一般性地引用它们:

public abstract class Shape<T extends TwoDimensionalShape> {
    public abstract String getName(); // Get the name of the shape for display purposes
    public abstract double getArea(); // Get the surface area of this Shape
}

public abstract class TwoDimensionalShape<T extends TwoDimensionalShape> extends Shape<T> {
    private double area = 0;
    public double getArea() {
        return this.area;
    }
    protected void setArea(double area) {
        this.area = area;
    }
}

public class Circle extends TwoDimensionalShape<Circle> {
    public Circle ( double radius ) {
        setArea( Math.PI * Math.pow(radius, 2) );
    }
    public String getName() {
        return "Circle";
    }
}

public class Square extends TwoDimensionalShape<Square> {
    public Square ( double width, double height ) {
        setArea( width * height );
    }
    public String getName() {
        return "Square";
    }
}

答案 1 :(得分:0)

我对这些项目感到非常恼火的是,他们明确要求你在不需要的时候创建课程。这只会让那些无法弄清楚他们为什么要做某事的学生感到困惑,因为实际上没有理由去做。你没有理由拥有一个Shape类。在现实世界中,我会以此为借口摆脱它。因为你需要有一个我发明它存在的理由:颜色。这样您就可以看到Shape可能有用。如果你说“我不需要颜色”,我说“你不需要形状”。看看它是如何工作的?

我在这里使用一个叫做静态内部类的脏小技巧,所以这一切都在一个文件中工作。如果你复制它至少取类的静态并将它们移动到自己的文件中。

import java.util.Scanner;

public class AreaExcersice {

    public static Scanner input = new Scanner(System.in);

    public static void main(String[] args) {
        System.out.println("Choose 1 for circle or 2 for square:");
        int userInput = Integer.parseInt( input.nextLine() );

        TwoDimensionalShape twoDShape = null; 
        if (userInput == 1) {
            System.out.println("Enter a radius for circle:");
            int radius = Integer.parseInt( input.nextLine() );    

            twoDShape = new Circle("Blue", radius, radius, radius);
        } else if (userInput == 2) {
            System.out.println("Enter a length for the sides of the square");
            int side = Integer.parseInt( input.nextLine() );    

            twoDShape = new Rectange("Green", 0, 0, side, side);
        } else {
            System.out.println("Invalid input.");
        }

        if (twoDShape != null) {
            System.out.println( twoDShape.toString() );        
        }
    }

    public static abstract class Shape {
        String color;
        public Shape(String color) {
            this.color = color;
        }

        public abstract String toString();
    }

    public static abstract class TwoDimensionalShape extends Shape {
        int x;
        int y;
        public TwoDimensionalShape(String color, int x, int y) {
            super(color);
            this.x = x;
            this.y = y;
        }
        public abstract double getArea();
    }

    public static class Circle extends TwoDimensionalShape {
        int radius;
        public Circle(String color, int x, int y, int radius) {
            super(color, x, y);
            this.radius = radius;            
        }
        @Override
        public double getArea() {
            return Math.PI * Math.pow(radius, 2);
        }
        @Override
        public String toString() {
            return color + " circle at " + x + ", " + y + " with radius " + 
                radius + " and area of " + getArea();
        }
    }

    public static class Rectange extends TwoDimensionalShape {
        int height;
        int width;
        public Rectange(String color, int x, int y, int height, int width) {
            super(color, x, y);
            this.height = height;
            this.width = width;
        }
        @Override
        public double getArea() {
            return width * height;
        }
        @Override
        public String toString() {
            return color + " rectange at " + x + ", " + y + " with height " + 
                height + ", width " + width + " and area of " + getArea();
        }
    }
}

显示器:

Choose 1 for circle or 2 for square:
1
Enter a radius for circle:
20
Blue circle at 20, 20 with radius 20 and area of 1256.6370614359173

这可能有些过分,但它应该清楚地向您展示继承结构可以为您做什么。每个类只有特定的实现代码。没有什么是重复的。相反,它是共享的。有问题吗?

答案 2 :(得分:0)

因此,拥有TwoDimensionalShapes的观点有点模糊,但我们可以猜测它定义的方法类似于&#34; getArea()&#34;没有实现它们。扩展TwoDimensionalShapes的每个类都必须实现自己的区域计算。

我不会想像&#34; setArea(双面积)&#34;非常有用;区域不是很难计算,我们需要存储它们,并存储它们会导致其他问题。

所以我们最终得到类似的东西:

public TwoDShape extends Shape // I have no use for Shape in this example...
{
  public double getArea();  // this is an abstract method, hope you've covered those.
}

public Circle extends TwoDShape
{
  private double radius;
  public Cirlcle(double givenRadius) { radius = givenRadius; }

  public double getArea() { return PI*radius*radius; }
}

我遗漏了很多东西。例如,getArea()应确保radius不为0并执行类似抛出异常的操作。

现在,要使用它,您可能有:

public class Main
{
  public static void main(String ... arguments)
  {
    Circle c = new Circle(4.0);
    System.out.println("Radius of 4 gives area of " + c.getArea(); 
  }
}

现在,我将离开Square去做,它将与Circle非常相似。让我们知道怎么回事。在您完成Square之后,您将能够执行以下操作:

public Main
{
  public static void main(String ... arguments)
  { 
    Shape[] shapes = new Shape[3];
    shapes[0] = new Circle(4.0);
    shapes[1] = new Square(5.0);
    shapes[2] = new Square(6.0);
    for (shape : shapes)
    {
      System.out.println("Area is " + shape.getArea());
    }
  }
}

答案 3 :(得分:0)

谢谢你们!你们都很棒!!我还没有涵盖抽象类,但你的显式代码向我展示了方式!点击我和唉!我看到房间里的灯光闪耀!我崇拜你的程序员以及敬佩你,因为有一天我会像你们一样成为一名专业人士。我正在努力在编程领域内获得深刻的知识,这只是一个开始。再次非常感谢你清理我的头并指出我正确的方向!自己完成一个程序并正确输出它感觉非常好,感谢Stack Overflow及其所有成员!我是一个菜鸟,第一次在这里发帖,所以我可能会因为格式错误而被投票回答。