2011-07-11 16 views
7

इस सरल स्काला वर्ग पर विचार करें:वंचित कन्स्ट्रक्टर फ़ील्ड ओवरराइड करते समय अंतर?

class A(val d: Int) 

वहाँ (व्यवहार या उत्पन्न बाईटकोड में या तो) स्काला में एक फर्क है

class B(d: Int) extends A(d) 

और

class B(override val d: Int) extends A(d) 

के बीच या दोनों बराबर हैं? यदि वे अलग हैं, तो उनमें से प्रत्येक के लिए विशिष्ट उपयोग क्या होगा?

A को class A(var d: Int) के रूप में परिभाषित किया गया यह अलग होगा?

उत्तर

9

vals के लिए, कोई अर्थपूर्ण अंतर नहीं है। हालांकि, उत्पन्न बाइटकोड में कोई अंतर हो सकता है। विशेष रूप से, यदि व्युत्पन्न वर्ग में परिभाषित एक विधि d को संदर्भित करती है, तो यह उसी नाम के val के बजाय निर्माता पैरामीटर d को संदर्भित करता है। यह व्युत्पन्न वर्ग के लिए उत्पन्न एक अतिरिक्त निजी क्षेत्र के माध्यम से लागू किया जाता है।

वर्र्स के लिए, व्यवहार में अंतर है। ओवरराइड के बिना, व्युत्पन्न कक्षा के भीतर से d का संदर्भ देने वाले किसी भी तरीके से कन्स्ट्रक्टर पैरामीटर का जिक्र होगा, जबकि वर्ग के बाहर से d का संदर्भ देने वाले कॉलर्स फ़ील्ड प्राप्त करेंगे। इस मामले में, दो मान भिन्न हो सकते हैं (यदि निर्माण के बाद मूल्य बदल गया है)।

scala> class A(var d: Int) 
defined class A 

scala> class B(d: Int) extends A(d) { override def toString = "d: " + d } 
defined class B 

scala> val b = new B(1) 
b: B = d: 1 

scala> b.d = 2 

scala> b.d 
res1: Int = 2 

scala> b 
res2: B = d: 1 

इस सवाल से संबंधित है:

यहाँ एक सत्र है कि एक वर के साथ व्यवहार को दर्शाता है है Idiomatic Scala way to deal with base vs derived class field names?