Печать результатов метода clone()

Обратите внимание: я создал пост ранее, в котором этот вопрос содержался вместе с несколькими другими, но мне сказали, что, поскольку я задавал так много вопросов в одном и том же посте, было бы лучше разбить его на отдельные вопросы. Поэтому, пожалуйста, не помечайте это как дубликат, да, инструкции одинаковы, и да, используется один и тот же код, но сам вопрос другой. Благодарю.

Я работаю над программой со следующими инструкциями:

Напишите класс с именем Octagon, который расширяет GeometricObject и реализует интерфейсы Comparable и Cloneable. Предположим, что все 8 сторон восьмиугольника имеют одинаковый размер. Площадь может быть рассчитана по следующей формуле

площадь = (2 + 4/ квадратный корень из 2) * сторона * сторона

Напишите программу (драйвер) для чтения ряда значений из файла, отобразите область и периметр, создайте клон и сравните объект и его клон (в зависимости от области). Кроме того, ваша программа должна сравнить текущий объект (только что прочитанный) с первым прочитанным объектом. Программа заканчивается, когда из файла читается отрицательное число.

Вот код, который у меня есть, это мой класс GeometricObject:

public abstract class GeometricObject {

    public abstract double getArea();
    public abstract double getPerimeter(); 
}

Мой класс восьмиугольника:

public class Octagon extends GeometricObject implements Comparable<Octagon>, Cloneable {

    private double side;

    public Octagon() {
    }

    public Octagon(double side) {
        this.side = side;
    }

    public double getSide() {
        return side;
    }

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

    public double getArea() {
        return (2 + (4 / (Math.sqrt(2))) * side * side); 
    }

    public double getPerimeter() {
        return side * 8;
    }

    public String toString() {
        return "Area: " + getArea() + "\nPerimeter: " 
            + getPerimeter() + "\nClone Compare: " +  "\nFirst Compare: ";
    }

    public int compareTo(Octagon octagon) {
        if(getArea() > octagon.getArea()) 
            return 1;
        else if(getArea() < octagon.getArea()) 
                return -1;
        else
            return 0;
    }

    @Override 
    public Octagon clone() {
        return new Octagon(this.side);
    } 
}

И мой класс водителя или тестера: (Здесь я больше всего нуждаюсь):

import java.util.*;

public class Driver {
    public static void main(String[] args) throws Exception {
        java.io.File file = new java.io.File("prog7.dat");
        Scanner fin = new Scanner(file);
        Octagon first = null;
        int i = 1;
        Octagon older;

        while(fin.hasNext())
        {
            double side = fin.nextDouble();
            if(side < 0.0)
                break;
            Octagon oct = new Octagon(side);
            System.out.print("Octagon " + i + ": \"" + oct.toString() + "\"");
            if (first == null) {
                first = oct;
                System.out.print("Equal");
            }
            else {
                int comparison = oct.compareTo(first);
                if (comparison < 0)
                    System.out.print("less than first");
                else if (comparison > 0)
                    System.out.print("greater than first");
                else 
                    System.out.print("equal");
            }
            String cloneComparison = "Clone Compare: ";
            older = oct;
            Octagon clone = oct.clone();
            if ( older.getArea() == clone.getArea() ){
                cloneComparison = cloneComparison + "Equal";
            } else {
                cloneComparison = cloneComparison + "Not Equal";
            }
            //System.out.println(cloneComparison);
            i++; 
            first = new Octagon(side);
            System.out.println();
        }
        fin.close();
    }
}

И вот файл, используемый для получения ввода. Каждая строка - это один восьмиугольник:

5.0
7.5
3.26
0.0
-1.0

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

Как написано в приведенном выше коде, вот мой вывод:

Octagon 1: "Area: 72.71067811865474
Perimeter: 40.0
Clone Compare: 
First Compare: "EqualClone Comparision: Equal

Octagon 2: "Area: 161.09902576697317
Perimeter: 60.0
Clone Compare: 
First Compare: "greater than firstClone Comparision: Equal

Octagon 3: "Area: 32.0593921109526
Perimeter: 26.08
Clone Compare: 
First Compare: "less than firstClone Comparision: Equal

Octagon 4: "Area: 2.0
Perimeter: 0.0
Clone Compare: 
First Compare: "less than firstClone Comparision: Equal

Но мне нужно, чтобы это выглядело примерно так:

Octagon 1: Area: 2.0
Perimeter: 0.0
Clone Compare: Equal
First Compare: less than first

Я чувствую, что это, вероятно, что-то не так с моим методом toString() в моем классе Octagon, так как именно здесь я печатаю getArea() и getPerimeter(), но я не могу заставить его скомпилировать с cloneComparison в этом операторе возврата.

Вот некоторые вещи, которые я пробовал с оператором return моего метода toString():

"\nClone Compare: " + cloneComparison + ...
"\nClone Compare: " + oct.cloneComparison + ...
"\nClone Compare: " + Driver.cloneComparison + ...
And
"\nClone Compare: " + Octagon.cloneComparison + ...

Любой вклад с благодарностью.

1 ответ

Решение

Ваш toString() метод возвращает слишком много. Некоторые из выводимых вами данных будут выводиться вашим основным методом, поэтому он не принадлежит toString(), Какая часть кода отвечает за что? Если ваша основная программа печатает информацию для сравнения, пусть она распечатывает информацию для сравнения (вместе с метками вроде Clone compare:)и не вставляйте это в toString(),

В целом, полезно определить, каковы обязанности каждого класса. Один из способов думать об этом: "Если бы был какой-то другой класс, кроме Driver, используя мой Octagon класс, что бы этот класс ожидал, если бы он позвонил toString на Octagon объект?"Это, конечно, не ожидал бы, что результат будет включать строки "Clone compare", поскольку это не имеет ничего общего с Octagon; это больше связано с тем, что Driver хочет сделать. Разделение обязанностей на их логические места, как это, является одной из самых важных вещей, которые нужно изучить в объектно-ориентированном программировании, и, я бы сказал, является одной из основных причин, по которой было изобретено объектно-ориентированное программирование.

Кроме того, вывод, который вы хотите получить, не имеет кавычек, поэтому вы не должны включать их в строку, которую вы печатаете (где после вас идет обратный слеш, за которым следует ").

Другие вопросы по тегам