2013-04-16 31 views
11

Tôi đang viết mã để tạo một đối tượng, sao chép đối tượng, sau đó so sánh hai đối tượng.clone() đã được bảo vệ quyền truy cập tạo ra đối tượng công cộng bản sao()

Đối tượng trong câu hỏi, Octagon, là một phần mở rộng của một đối tượng 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; 
} 

Trong một file có tên Octagon.java

Trong một, TestOctagon.java, là phương pháp chính của tôi:

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


    } 
} 

Lỗi xảy ra ở dòng cuối cùng của phương pháp chính.

clone() has protected access in Object 

Tôi đã thử đổi tên phương pháp nhân bản trong Octagaon, nói với cloneme, nhưng sau đó tôi nhận được lỗi:

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

tôi nhận được cảm giác vấn đề là vì Octagon mở rộng đối tượng khác, có lẽ ?

Tôi thực sự không thể tìm thấy giải pháp nào và tôi đã dành một giờ tốt để đọc tất cả các bản sao khác() bài đăng ở đây.

Chỉnh sửa: Tôi bắt buộc phải sử dụng bản sao. Tôi biết sự đồng thuận chung là bản sao được borked.

+1

Bạn không có thể ghi đè một phương pháp bảo vệ được công khai. Trong lớp 'Octagon' của bạn định nghĩa nó như là' protected Object clone() ' –

Trả lời

7

Thay

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

với

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

để được gọi là phương pháp nhân bản là một trong những lớp học của bạn.

+0

Chính xác những gì cần thiết. Cảm ơn nhiều. Tôi cần phải sử dụng một cái gì đó tương tự như gọi hàm 'compareTo (Octagon o)' tùy chỉnh cũng như '((Octagon) test) .compareTo (copy); 'Có vẻ vô lý điều này không được đề cập đến trong sách giáo khoa của tôi. – Dirgon

+0

bản sao được xem là thiết kế kém, đó là lý do tại sao bạn có thể không thấy nó quá nhiều trong sách giáo khoa. –

+0

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

7

Bạn có thể viết một bản sao-constructor:

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

Và sử dụng nó từ phương pháp nhân bản:

public Object clone() throws CloneNotSupportedException { 
    return new Octagon(this); 
} 
Các vấn đề liên quan