【问题标题】:How can I get the different results as I put the number?当我输入数字时,如何获得不同的结果?
【发布时间】:2019-05-04 15:47:17
【问题描述】:

我想得到不同的结果作为输入的数字。

例如,当我输入 4 时,我得到矩形的结果,当我输入 3 时,我得到三角形。

import java.util.Scanner;

public class Source9_1 {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    int x, y; // 클래스 Parameter(내부 변수)

    Point[] v = new Point[n]

    for(int i=0; i <= v.length; i++) {
        v[i] = new Point();
        v[i].

    }
}

class Point {
    int x, y; // 클래스 Parameter (내부 변수)

    public void setPoint(int x, int y) { // Point 세팅
        this.x = x;
        this.y = y;
    }

    public void printPoint() { // Point 출력
        System.out.println("x = " + x + ", y = " + y);
    }
}

class Rectangle extends Point {
    Point[] p = new Point[4];

    Rectangle(Point[] p) {
        this.p = p;
    }
}

class Triangle extends Point {
    Point[] p = new Point[3]; // 3개의 Point인스턴스를 담을 배열 생성

    Triangle(Point[] p) {
        this.p = p;
    }
}

class Shape extends Point { // Point 배열 및 상속을 받아 세팅 후 출력가능한 클래스
    Point coord[10];
    static int s = 0; // 불릴 때마다 값 증가 ???

    public void printShapePoint() { // 배열에 담은 Point 출력

    }

    public void setShapePoint() { // 배열에 담기 위해 Point 증가

    }
}

到目前为止,我是这样编码的,但我现在不知道该怎么做。

我怎样才能在输入数字时得到不同的结果?

This is the result what I want

【问题讨论】:

  • 看看Java中的switch-case,可能会对你有所帮助
  • 您在函数之外有语句代码。这是不允许的。这些代码中的一些不应该在main 函数中吗?
  • @PedroLima 哦,我错过了,谢谢!
  • 为什么矩形是点的子类?矩形更像是由点定义的形状......
  • 别看switch语句!这通常是一个糟糕的选择,而是尝试坚持您似乎正在采用的面向对象的方法。你到底想达到什么目的?不同的形状类应该做什么?

标签: java arraylist extends


【解决方案1】:

佩德罗的回答很好。我还有一个建议要提。使用开关或条件来创建不同类型的形状有点代码味道。我建议为此使用抽象工厂。我举了一个小例子来说明你如何做到这一点here

从点数推断形状可能是不够的。例如,一个矩形由两个点(不是四个点)定义,一条线也是如此,即使您当前没有对线进行建模。

我认为按名称选择形状并使用工厂从输入的点实例化它会更清楚。

请注意,他的形状对象层次结构被大量用于解释面向对象。像这样设计类结构有几个陷阱。参见例如this article。还要记住容易违反的 Liskov 替换原则,请参阅this article

【讨论】:

    【解决方案2】:

    首先,关于您的RectangleTriangle 课程。我觉得你在那里错过了你的观点(双关语不是故意的),因为你已经扩展了 Point 类。这没有多大意义,因为您有 Shape 类,作为它们的超类会做得更好。

    所以:

    class Rectangle extends Shape {
        ...
    }
    
    class Triangle extends Shape {
        ...
    }
    

    除此之外,您目前所拥有的:

    1. 您正在从输入中捕获点数;
    2. 您正在创建一个该大小的数组;
    3. 您正在为每个数组位置实例化和设置Point 对象。

    接下来需要做什么:

    1. 从输入中捕获点坐标
    2. 将所述坐标设置为Point 对象
    3. 实例化 TriangleRectangle 对象,具体取决于您拥有的点数。

    因此,在您的 for 声明中,您需要执行以下操作:

    for (int i=0; i <= v.length; i++) {
        v[i] = new Point();
        x = sc.nextInt(); // Save 'x' value into the variable
        y = sc.nextInt(); // Save 'y' value into the variable
        v[i].setPoint(x, y); // Set both values using the method from Point
    }
    

    然后,由于RectangleTriangle 都将Shape 作为公共超类,因此您可以将其中任一类的对象放入Shape 变量中。所以在for 声明之后你会想要做:

    Shape s; // Create the empty variable here, so it will exist outside the if-else scope
    if (n == 3)
        s = new Triangle(v);
    else
        s = new Rectangle(v);
    

    最后,只需打印您的积分:

    for (int i = 0; i < v.length; i++)
        v[i].printPoint();
    

    差不多就是这样。

    【讨论】:

    • 非常感谢您的详细解释!虽然我还没有得到你所说的一切,但它真的很有帮助:D
    猜你喜欢
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    相关资源
    最近更新 更多