2013-04-16 12 views
11

मैं ऑब्जेक्ट बनाने के लिए कोड लिख रहा हूं, ऑब्जेक्ट क्लोन कर रहा हूं, फिर दो की तुलना करें।क्लोन() ने एक्सेस किया है - सार्वजनिक ऑब्जेक्ट क्लोन()

सवाल, अष्टकोण में वस्तु, एक वस्तु का एक विस्तार 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; 
} 

है Octagon.java

एक और में, TestOctagon.java नाम की एक फ़ाइल में, मेरा मुख्य विधि है:

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


    } 
} 

त्रुटियां मुख्य विधि की अंतिम पंक्ति पर आती हैं।

clone() has protected access in Object 

मैं Octagaon में क्लोन विधि का नाम बदलने की कोशिश की है, cloneme कहता हूं, लेकिन फिर मैं त्रुटि मिलती है:

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

मैं महसूस कर रही है क्योंकि अष्टकोण किसी अन्य वस्तु फैली समस्या है, हो सकता है ?

मुझे वास्तव में कोई समाधान नहीं मिल रहा है, और मैंने यहां अन्य सभी क्लोन() पोस्ट पढ़ने में एक अच्छा घंटा बिताया है।

संपादित करें: यह आवश्यक है कि मैं क्लोन का उपयोग करूं। मुझे पता है कि आम सहमति है क्लोन बोर्क किया गया है।

+1

आप किसी सुरक्षित विधि ओवरराइड नहीं कर सकते सार्वजनिक किया जाना है। आपके 'अष्टकोण' वर्ग में इसे 'संरक्षित ऑब्जेक्ट क्लोन() ' –

उत्तर

7

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

साथ

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

बदलें ताकि बुलाया क्लोन विधि अपनी कक्षा से एक है।

+0

के रूप में परिभाषित करें जो वास्तव में आवश्यक था। बहुत धन्यवाद। मुझे कस्टम 'तुलना करने के लिए (अष्टकोण ओ)' फ़ंक्शन के साथ-साथ '((अष्टकोण) परीक्षण) को कॉल करने के समान कुछ उपयोग करने की आवश्यकता थी। कॉम्पैयर (प्रतिलिपि);' हास्यास्पद लगता है कि मेरी पाठ्यपुस्तक में कहीं भी इसका उल्लेख नहीं किया गया है। – Dirgon

+0

क्लोन व्यापक रूप से बुरी तरह डिज़ाइन के रूप में देखा जाता है, यही कारण है कि आप शायद पाठ्यपुस्तकों में इसे बहुत अधिक नहीं देखते हैं। –

+0

देखें http://www.artima.com/intv/bloch13.html –

7

आप एक प्रति-निर्माता लिख ​​सकते हैं:

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

और क्लोन विधि से इसका इस्तेमाल करते हैं:

public Object clone() throws CloneNotSupportedException { 
    return new Octagon(this); 
} 
संबंधित मुद्दे