Печать результатов метода 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
хочет сделать. Разделение обязанностей на их логические места, как это, является одной из самых важных вещей, которые нужно изучить в объектно-ориентированном программировании, и, я бы сказал, является одной из основных причин, по которой было изобретено объектно-ориентированное программирование.
Кроме того, вывод, который вы хотите получить, не имеет кавычек, поэтому вы не должны включать их в строку, которую вы печатаете (где после вас идет обратный слеш, за которым следует "
).