2010-03-08 10 views
82

स्कैला 2.8 में केस क्लास के कन्स्ट्रक्टर को अधिभारित करने का कोई तरीका है?ओवरलोड कन्स्ट्रक्टर?

यदि हां, तो कृपया एक स्निपेट डालने के लिए, अगर नहीं, तो कृपया बताएं क्यों?

उत्तर

151

ओवरलोडिंग कंस्ट्रक्टर्स मामले वर्गों के लिए विशेष नहीं है।

object Foo { 
    def apply(bar: Int) = new Foo(bar) 
} 

Foo(1, 2) 
Foo(1) 

स्कैला 2.8 में, नाम और डिफ़ॉल्ट पैरामीटर का अधिभार अधिभार के बजाय अक्सर उपयोग किया जा सकता है।

case class Baz(bar: Int, baz: Int = 0) 
new Baz(1) 
Baz(1) 
+0

बहुत अच्छा :) मैं स्केला में वापस आने मूल्यों की तरह कुछ के लिए देख रहा था, यह 2.8 से नई है? मुझे नहीं पता था :) – Felix

+0

हाँ, नामांकित और डिफ़ॉल्ट पैरामीटर स्कैला 2.8 में नए हैं। – retronym

+7

मार्टिन ओडर्स्की बताते हैं कि अतिरिक्त लागू विधियों को स्वचालित रूप से क्यों नहीं जोड़ा जाता है: http://www.scala-lang.org/node/976 –

17

आप एक अधिभारित कन्स्ट्रक्टर को सामान्य तरीके से परिभाषित कर सकते हैं, लेकिन इसे आमंत्रित करने के लिए आपको "नया" कीवर्ड का उपयोग करना होगा। ,

case class Foo(bar: Int, baz: Int) { 
    def this(bar: Int) = this(bar, 0) 
} 

new Foo(1, 2) 
new Foo(1) 

हालांकि आप भी साथी वस्तु है, जो कहा जाता है जब आप new छोड़ में apply विधि ओवरलोड पसंद कर सकते हैं:

scala> case class A(i: Int) { def this(s: String) = this(s.toInt) } 
defined class A 

scala> A(1) 
res0: A = A(1) 

scala> A("2") 
<console>:8: error: type mismatch; 
found : java.lang.String("2") 
required: Int 
     A("2") 
     ^

scala> new A("2") 
res2: A = A(2) 
+2

कि सख्ती से सच नहीं है - आप साथी वस्तु में यह घोषणा कर सकते हैं के रूप में सामान्य –