2012-10-15 13 views
6

जहां तक ​​मैंने सीखा है, स्कैला में लक्षण जावा में इंटरफेस के समान हैं, सिवाय इसके कि विधियों को कार्यान्वयन की अनुमति है। इसके अलावा, स्कैला कक्षाओं के विपरीत, आप उन्हें निर्माण के लिए तर्क नहीं दे सकते हैं।लक्षण तत्काल क्यों हैं?

अभी तक, बहुत अच्छा है। लेकिन मुझे उन्हें तुरंत चालू करने की अनुमति क्यों है? वास्तव में, मुझे इसकी अनुमति देने का एक अच्छा कारण नहीं दिख रहा है।

+1

जावा: 'इंटरफ़ेस बार {}; बार बार = नया बार() {}; ' – soc

उत्तर

22

आप वास्तव में उन्हें तुरंत चालू नहीं करते हैं। जैसा कि आपने जावा के साथ समानांतर खींचा है, चलिए आगे बढ़ें। आप जावा में एक अमूर्त वर्ग या इंटरफ़ेस से बेनामी क्लास बनाने में सक्षम हैं। यह स्काला में लगभग एक ही है:

scala> trait A 
defined trait A 

scala> new A {} 
res0: A = [email protected] 

ध्यान दें कि घुंघराले ब्रेसिज़ अनिवार्य हैं जब आप एक विशेषता से एक वस्तु बना सकते हैं। उदाहरण के लिए, योन ऐसा नहीं कर सकते:

scala> new A 
<console>:9: error: trait A is abstract; cannot be instantiated 
       new A 
      ^

यह एक वर्ग के लिए पूरी तरह से काम करता है, जबकि:

scala> class B 
defined class B 

scala> new B 
res2: B = [email protected] 
बेशक

अगर आपके विशेषता में कुछ तत्वों को लागू नहीं किया जाता है, तो आप उन्हें लागू करने के लिए जब आप बनाने की जरूरत है ऑब्जेक्ट:

scala> trait C {def foo: Int} 
defined trait C 

scala> new C {} 
<console>:9: error: object creation impossible, since method foo in trait C of type => Int is not defined 
       new C {} 
       ^

scala> new C {def foo = 42} 
res4: C = [email protected] 
+0

+1 थाक्स, जिसने कुछ प्रकाश डाला :-)। – helpermethod

+4

जावा के साथ इसकी तुलना करने के लिए: जब आप 'नया ए {}' लिखते हैं तो आप एक अज्ञात वर्ग बना रहे हैं जो विशेषता 'ए' को बढ़ाता है; '{}' अज्ञात वर्ग का शरीर है (जैसे जावा में अनाम आंतरिक कक्षाएं)। – Jesper

+0

'नया ए {}' वही बात है जो ' – sourcedelica

संबंधित मुद्दे