2011-12-23 16 views
7

मैं लिख रहा हूँ अधिभावी एक trait कि, विधि clone एक CloneResult लौटने निर्दिष्ट करना चाहिए ताकि:स्काला: निर्दिष्ट सार्वजनिक विधि संरक्षित विधि

trait TraitWithClone extends Cloneable { 
    def clone: CloneResult 
} 

यहाँ इरादा java.lang.Object की वापसी प्रकार अप मजबूत करने के लिए है ' इस इंटरफेस के लिए उपयोगी कुछ clone()। हालांकि, जब मैं इस संकलन करने का प्रयास करें, मैं:

error: overriding method clone in trait View2 of type()CloneResult; method clone in class Object of type()java.lang.Object has weaker access privileges; it should be public; (Note that method clone in trait View2 of type()CloneResult is abstract, and is therefore overridden by concrete method clone in class Object of type()java.lang.Object)

मैं कैसे कर सकते हैं की आवश्यकता होती है एक कार्यान्वयन public हो कि, जब स्काला कीवर्ड नहीं है? मुझे पता है कि मैं कर सकता हूं:

trait TraitWithClone extends Cloneable { 
    override def clone = cloneImpl 
    protected def cloneImpl: CloneResult 
} 

... लेकिन यह एक हैक जैसा लगता है। कोई सुझाव?

+0

करता है 'ओवरराइड डीईएफ़ क्लोन(): CloneResult' काम करते हैं? –

+0

नहीं; यह पहली बात थी जिसकी मैंने कोशिश की थी। –

+0

कोष्ठक के साथ? –

उत्तर

4

यहां त्रुटि संदेश का महत्वपूर्ण हिस्सा है: "और इसलिए क्लास ऑब्जेक्ट में कंक्रीट विधि क्लोन द्वारा ओवरराइड किया गया है"।

आपको अपनी विशेषता में clone विधि का कार्यान्वयन प्रदान करना चाहिए। यह आदर्श नहीं है, लेकिन clone के बाद से आपको यह करना है Object पर एक ठोस विधि है। हालांकि

trait TraitWithClone extends Cloneable { 
    override def clone: CloneResult = throw new CloneNotSupportedException 
} 

, आम तौर पर आप सिर्फ बात की इस तरह अपने ठोस कक्षा में सीधे कार्य करें:

class Foo extends Cloneable { 
    override def clone: Foo = super.clone.asInstanceOf[Foo] 
} 

scala> new Foo 
res0: Foo = [email protected] 

scala> res2.clone 
res1: Foo = [email protected] 
संबंधित मुद्दे