2013-04-16 13 views
11

Scrivo codice per creare un oggetto, clonare l'oggetto, quindi confrontare i due.clone() ha accesso protetto - reso pubblico Oggetto clone()

L'oggetto in questione, Octagon, è un'estensione di un oggetto GeometricObject

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 un file chiamato Octagon.java

In un altro, TestOctagon.java, è il mio metodo principale:

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


    } 
} 

Gli errori si verificano sull'ultima riga del metodo principale.

clone() has protected access in Object 

Ho provato a cambiare titolo il metodo clone in Octagaon, dico cloneme, ma poi ho l'errore:

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

ho la sensazione che il problema è perché Octagon si estende un altro oggetto, forse ?

Non riesco davvero a trovare alcuna soluzione, e ho passato una buona ora a leggere tutti gli altri messaggi di clone() qui.

Modifica: È necessario utilizzare clone. Sono consapevole del consenso generale sul fatto che il clone sia bloccato.

+1

Non è possibile sostituire un metodo protetto per essere pubblico. Nella classe 'Octagon' definiscila come' Oggetto protetto clone() ' –

risposta

7

Sostituire

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

con

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

in modo che la chiamata metodo clone è quello della classe.

+0

Esattamente ciò che era necessario. Grazie mille. Avevo bisogno di usare qualcosa di simile per chiamare anche la funzione personalizzata 'compareTo (Octagon o)' ((ottagono)) .compareTo (copia); 'Sembra ridicolo che questo non sia menzionato da nessuna parte nel mio libro di testo. – Dirgon

+0

Il clone è ampiamente visto come mal progettato, è per questo che probabilmente non lo vedi troppo nei libri di testo. –

+0

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

7

Si può scrivere un costruttore di copia:

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

e utilizzarlo dal metodo clone: ​​

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