0

请注意:我之前创建了一个帖子,其中包含这个问题以及其他几个问题,但被告知由于我在同一个帖子中问了这么多问题,最好将其分解为单独的问题。所以请不要将此标记为重复,是的,说明是相同的,是的,正在使用相同的代码,但问题本身是不同的。谢谢。

我正在使用以下说明开发一个程序:

编写一个名为 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);
    } 
}

还有我的 Driver 或 tester 类:(这是我最需要帮助的地方):

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

我觉得这可能是我的 Octagon 类中的 toString() 方法有问题,因为这是我从中打印 getArea() 和 getPerimeter() 的地方,但我无法在该返回语句中使用 cloneComparison 编译它。

我用 toString() 方法的 return 语句尝试过的一些事情包括:

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

非常感谢任何输入。

4

1 回答 1

0

您的toString()方法返回太多。您想要的一些输出将由您的 main 方法输出,因此它不属于toString(). 代码的哪一部分负责什么?如果你的主程序是打印比较信息,让它打印比较信息(连同标签一样Clone compare:),不要放在toString().

一般来说,定义每个类的职责是有帮助的。一种思考方式是:“如果有其他类,除了Driver使用我的类之外,如果它调用一个对象Octagon,该类会期望什么?” 它当然不会期望结果包含像 ; 这样的字符串,因为这与;无关。它更多地与想要做的事情有关。像这样将职责分离到它们的逻辑位置是学习面向对象编程的最重要的事情之一——我想说,这也是发明面向对象编程的主要原因之一。toStringOctagon"Clone compare"OctagonDriver

此外,您说您想要的输出中没有引号,因此您不应该将它们包含在您正在打印的字符串中(您有反斜杠后跟")。

于 2014-08-05T04:00:51.790 回答