2014-08-04 4 views
1

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

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

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

area = (2 + 4/square root of 2) * side * side 

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

Вот код, который я до сих пор, это мой GeometricObject Класс:

public abstract class GeometricObject { 

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

Мой класс Octagon:

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); 
    } 
} 

И мой водитель или тестер класса: (Это где мне нужно the most help):

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 

Я с трудом выяснить, как я бы реализовать Cloneable интерфейс, так что, когда я распечатать результаты, они будут говорить Clone Сравнение: Равно (или не равны) ,

Любой ввод очень ценится.

+0

Почему вы сравниваете область? Просто сравните стороны. Area - это двойная вычисляемая с использованием sqrt (2), вы не можете просто сравнить ее с рассмотрением ошибки с плавающей запятой ... –

+0

Потому что это то, что сказали названные направления. –

+0

Вы действительно имеете в виду ['Cloneable'] (http://docs.oracle.com/javase/7/docs/api/java/lang/Cloneable.html)? Может быть, вам нужно «Сравнивать»? –

ответ

1

Что бы я сделал это первым реализовать метод Octagon.clone() пути создания Octagon с той же боковой длиной

Public Octagon clone(){ 
    return new Octagon(this.side); 
} 

В Driver иметь его клон вновь созданный Octagon и сравнить два (старше и новее) с чем-то вроде этого:

String cloneComparison = "Clone Comparision: "; 
if (older.getArea() == newer.getArea()){ 
    cloneComparison = cloneComparison + "Equal"; 
} else { 
    cloneComparison = cloneComparison + "Not Equal"; 
} 
System.println(cloneComparison); 

Который также возвращает правильную строку depe на результат.

+0

В части Octagon.clone() это будет еще один метод в дополнение к тому, который у меня уже есть "@Override Octagon clone() {..." или просто изменение кода внутри этого существующего метода для this.getSide (), а не this.side, как это написано сейчас? –

+0

@Beth Что вы уже сделали, это прекрасно: 'this.side' vs' this.getSide()' действительно несущественно. Я не понимаю, каков ваш реальный вопрос. – EJP

+0

О, хорошо, просто хотел убедиться, как я уже сказал, я никогда не использовал это раньше, так что все еще изучаю, как все работает. –

Смежные вопросы