2013-04-16 13 views
11

Piszę kod, aby utworzyć obiekt, sklonować obiekt, a następnie porównać dwa.Klon() ma chroniony dostęp - publiczny klon obiektu()

dany obiekt, Octagon, stanowi rozszerzenie przedmiotu 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; 
} 

w pliku o nazwie Octagon.java

w innym, TestOctagon.java, jest moim głównym metoda:

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


    } 
} 

Błędy pojawiają się w ostatnim wierszu metody głównej.

clone() has protected access in Object 

Próbowałem zmiany nazwy metody klonowania w Octagaon, powiadam cloneme, ale potem pojawia się błąd:

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

Mam wrażenie, że problem jest z powodu Octagon rozciąga się inny obiekt, może ?

Naprawdę nie mogę znaleźć rozwiązania, a ja spędziłem dobrą godzinę czytając wszystkie inne posty clone() tutaj.

Edycja: Jest to wymagane Używam klonu. Zdaję sobie sprawę, że ogólny konsensus jest zepsuty.

+1

Nie można zastąpić zabezpieczoną metodę jawne. W swojej klasie 'Octagon' zdefiniuj go jako' protected Object clone() ' –

Odpowiedz

7

Wymień

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

z

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

tak, że nazywa się metoda clone jest jednym z klasy.

+0

Dokładnie to, co było potrzebne. Dzięki wielkie. Musiałem użyć czegoś podobnego do wywołania niestandardowej funkcji 'compareTo (Octagon o)' oraz ((Octagon)). CompareTo (copy); 'Wydaje się śmieszne, o czym nie wspomnę w żadnym miejscu w moim podręczniku. – Dirgon

+0

Klon jest powszechnie postrzegany jako źle zaprojektowany, dlatego prawdopodobnie nie widzisz go zbyt wiele w podręcznikach. –

+0

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

7

Możesz napisać kopiowaniem konstruktora:

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

i używać go z metody clone: ​​

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