Ошибка исключения несоответствия ввода? - PullRequest
0 голосов
/ 15 мая 2018

Я пишу этот код:

Мы ориентируемся на три геометрические фигуры: круг, прямоугольник и квадрат. Каждая из этих фигур является геометрической, следовательно, эти геометрические формы могут иметь родительский класс (geometryShape), который включает в себя общие черты этих фигур.

В то же время каждая геометрическая фигура является печатным и сопоставимым объектом, среди других объектов, которые также могут быть печатаемыми и сопоставимыми, следовательно, эти фигуры будут наследовать печатность и сопоставимость от двух интерфейсов: Printable и Comparable.

Наконец, поскольку квадрат является частным случаем прямоугольника, квадрат будет расширяться от прямоугольника в нашем дизайне.

Моя проблема - заставить квадрат принимать только одно входное значение (сторона), в то время как предполагается, что он наследует свойства прямоугольника (который принимает 2 входных значения, ширину и высоту)

Я пытался использовать конструктор без аргументов и супер-конструктор в классе Rectangle, но ни один из них не помог решить эту проблему.

Возможно ли, что проблема связана с чем-то кроме конструкторов?

код класса прямоугольника:

class Rectangle extends geometricShape {

     private double width, height;
     private double side;

     Rectangle(){
        super();
     }

     Rectangle (double side){
        this.side=side;
     }


     Rectangle(double width, double height) {
          super.setShapeName("Rectangle");
          this.width = width;
          this.height = height;
     }

    public void setSide(double side) {
        this.side = side;
    }

    public double getSide() {
        return side;
    }

    @Override
    public double gerPerimeter() {
        return 2 * (width + height);
    }


    @Override
    public double getArea() {
        return width * height;
    }

    public double getWidth() {
         return width;
    }

    public void setWidth(double width) {
         this.width = width;
    }

    public double getHeight() {
         return height;
    }

    public void setHeight(double height) {
          this.height = height;
    }
}

код квадрата:

class Square extends Rectangle {

     double side;

     Square(double side) {
          super.setShapeName("Square");
          this.side = side;
     }

     public double getside() {
           return side;
     }

     public void setside(double s) {
           side = s;
     }

}

Это остальная часть кода (без квадрата и прямоугольника)

             public class Inheritance {

public static void main(String[] args) {
    int Select;
    double Value1, Value2;
    String s;
    geometricShape Shapes[] = new geometricShape[2];
    Scanner input = new Scanner(System.in);
    for (int i = 0; i < 2; i++) {
        s = (i < 1) ? "first " : "second ";
        System.out.println("Choose the " + s + "shape type:\n" + "(1) for a circle\n" + "(2) for a rectangle\n" + "(*) for a square");         // "*" means any other number 

        Select = input.nextInt();

        switch (Select) {
            case 1:
                System.out.print("Enter the radius: ");
                Value1 = input.nextDouble();
                Shapes[i] = new Circle(Value1);
                break;
            case 2:
                System.out.print("Enter the width: ");
                Value1 = input.nextDouble();
                System.out.print("Enter the height: ");
                Value2 = input.nextDouble();
                Shapes[i] = new Rectangle(Value1, Value2);
                break;
            default:
                System.out.print("Enter the side length: ");
                Value1 = input.nextDouble();
                Shapes[i] = new Square(Value1);
                break;
        }
    }

    System.out.println("The larger shape is:");
    if (Shapes[0].isLargerThan(Shapes[1])) {
        Shapes[0].print();
    } else {
        Shapes[1].print();
    }
}

public Inheritance() {
}

}

Сопоставимый интерфейс {

public boolean isLargerThan(E obj);     // The method returns true if the self object is larger than obj } 

interface Printable {

    public void print();
    /* For simplicity, let this method prints "A " + object name        + "with area: " + shape area */ }

abstract class geometricShape implements Comparable<geometricShape>, Printable {

    private String shapeName;

    abstract public double gerPerimeter();

    abstract public double getArea();

    public String getShapeName() {
        return shapeName;
    }

    public void setShapeName(String Name) {
        shapeName = Name;
    }

    @Override
    public boolean isLargerThan(geometricShape obj) {
        return this.getArea() > obj.getArea();
    }

    @Override
    public void print() {
        System.out.println("A " + this.getShapeName()
                + " with area: " + this.getArea());
    }
}

/*part 1*/
class Circle extends geometricShape {

    private double radius;

    Circle(double newRadius) {
        super.setShapeName("Circle");
        radius = newRadius;
    }

    @Override
    public double gerPerimeter() {
        return 2 * 3.14 * radius;
    }

    @Override
    public double getArea() {
        return 3.14 * radius * radius;
    }

    public void setradius(double r) {
        radius = r;
    }

    public double getradius() {
        return radius;
        }}

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Вы можете создать классы как geometricShape класс, имеющий абстрактный метод, например area(), perimeter() Подкласс, например, Rectangle будет иметь поля ширины, длины и переопределит area() и perimeter()

0 голосов
/ 15 мая 2018

Описанную проблему с Square и Rectangle можно легко решить, передав один (боковой) аргумент конструктору Square и передав этот аргумент дважды (как по ширине, так и по высоте) в конструктор Rectangle:

public class Square extends Rectangle {
    ...
    public Square (double side) {
        super (side, side);
    }
    ...
    public double getSide () {
        return getWidth (); // a Rectangle method
    }

    public void setside(double s) {
        setWidth(s); // a Rectangle method
        setHeight(s); // a Rectangle method
    }
    ...
}

Вашему классу Square не требуется переменная экземпляра side. И ваш Rectangle класс также не требует этого (он имеет width и height).

Обратите внимание, что это не мешает пользователю вашего класса устанавливать ширину и высоту Square в различные значения. Чтобы предотвратить это, вы можете переопределить методы setWidth() и setHeight() класса Rectangle в классе Square. Поведение может быть следующим: всякий раз, когда вы изменяете ширину Square (вызывая setWidth()), ее высота изменяется на одно и то же значение, и наоборот.

public class Square extends Rectangle {
    ...
    public Square (double side) {
        super (side, side);
    }
    ...
    public double getSide () {
        return getWidth (); // a Rectangle method
    }

    public void setside(double s) {
        super.setWidth(s);
        super.setHeight(s);
    }

    @Override
    public void setWidth(double w) {
        setSide(w);
    }

    @Override
    public void setHeight(double h) {
        setSide(h);
    }
    ...
}

P.S. этот ответ не объясняет исключение, которое вы упомянули, просто потому, что вы не включили код, который создает это исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...