2013-04-16 5 views
11

Ich schreibe Code, um ein Objekt zu erstellen, klonen Sie das Objekt, dann vergleichen Sie die beiden.clone() hat geschützten Zugriff - public Objekt clone()

Das Objekt in Frage, Octagon, eine Erweiterung eines Objekts GeometricObject ist

public class Octagon extends GeometricObject implements Comparable<Octagon>, Cloneable { 
private double side; 

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

public Object clone() throws CloneNotSupportedException { 
    Octagon octClone = (Octagon)super.clone(); 
    return octClone; 
} 

In einer Datei namens Octagon.java

In einer anderen, TestOctagon.java, ist meine Hauptmethode:

public class TestOctagon { 
    public static void main(String[] args) { 
     GeometricObject test = new Octagon(5); //create an Octagon with a side of 5 
     System.out.println("Area is: "+test.getArea()); 
     System.out.println("Perimeter is: "+test.getPerimeter()); 

     Octagon copy = (Octagon)test.clone(); 


    } 
} 

Die Fehler treten in der letzten Zeile der Hauptmethode auf.

clone() has protected access in Object 

Ich habe versucht, die Klon-Methode in Octagaon umbenennen, sagen cloneme, aber dann bekomme ich den Fehler:

cannot find symbol 
symbol: method cloneme() 
location: variable test of type GeometricObject 

Ich habe das Gefühl, das Problem ist, weil Octagon ein anderes Objekt erstreckt, vielleicht ?

Ich kann wirklich keine Lösung finden, und ich habe eine gute Stunde damit verbracht, alle anderen clone() Beiträge hier zu lesen.

Bearbeiten: Es ist erforderlich, ich verwende Klon. Ich bin mir bewusst, dass der allgemeine Konsens ist, dass der Klon geborken wird.

+1

Sie können keine geschützte Methode außer Kraft setzen Öffentlichkeit. In Ihrer 'Octagon' Klasse definieren Sie es als' protected Object clone() ' –

Antwort

7

ersetzen

Octagon copy = (Octagon)test.clone(); 

mit

Octagon copy = (Octagon)((Octagon)test).clone(); 

, so dass die genannten Klon-Methode das eine Ihrer Klasse.

+0

Genau was benötigt wurde. Vielen Dank. Ich musste etwas Ähnliches verwenden, um die benutzerdefinierte 'compareTo (Octagon o)' -Funktion auch '((Octagon) test) zu verwenden. CpareTo (copy);' Scheint lächerlich, dass dies nirgendwo in meinem Lehrbuch erwähnt wird. – Dirgon

+0

Klon wird weithin als schlecht entworfen angesehen, deshalb sehen Sie es wahrscheinlich nicht zu viel in Lehrbüchern. –

+0

Siehe http://www.artima.com/intv/bloch13.html –

7

Sie können eine Kopie-Konstruktor schreiben:

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

Und es aus dem Klon-Methode verwenden:

public Object clone() throws CloneNotSupportedException { 
    return new Octagon(this); 
}