2010-01-13 20 views
9

के समान सदस्य चर के साथ व्युत्पन्न स्कैला केस क्लास क्या ऐसा करने का एक अच्छा तरीका है?बेस सदस्य

scala> case class A(x : Int) 
defined class A 

scala> case class B(override val x : Int, y : Int) extends A(x) 
defined class B 

मैं बी के साथ विस्तार कर रहा हूं और अतिरिक्त सदस्य चर जोड़ रहा हूं। X से पहले override val लिखना अच्छा नहीं होगा।

+0

यह उदाहरण लगता है कि मैं थोड़ा उधम मचाते होने रहा हूँ, लेकिन सभी 'ओवरराइड def's को जोड़ने के लिए शुरू अगर आधार वर्ग सदस्य चर का एक बहुत है। – Dave

+0

ठीक है, जहां तक ​​मुझे पता है, केस क्लास इस तरह काम करते हैं। – F0RR

उत्तर

14

मैं दृढ़ता से सलाह देता हूं कि किसी केस क्लास से उत्तराधिकारी न हो। इसके बराबर और हैशकोड पर आश्चर्यजनक प्रभाव पड़ते हैं, और स्कैला 2.8 में इसे हटा दिया गया है।

इसके बजाय, एक विशेषता या एक अमूर्त वर्ग में x परिभाषित करें।

scala> trait A { val x: Int } 
defined trait A 

scala> case class B(val x: Int, y: Int) extends A 
defined class B 

http://www.scala-lang.org/node/3289

http://www.scala-lang.org/node/1582

+0

2.8 पर मैं बराबर/हैशकोड के बारे में कुछ भी surprizing नहीं देखता। बराबर के सभी आवश्यक गुणों को सबसे सहज तरीके से बनाए रखा जाता है। ('केस क्लास ए' के ​​रनटाइम प्रकार के साथ उदाहरण 'केस क्लास बी' के उदाहरणों के बराबर नहीं होते हैं, भले ही इसमें विरासत शामिल है)। –

+12

सटीक होने के लिए, केस कक्षाओं को अन्य केस कक्षाओं से प्राप्त नहीं होना चाहिए। सामान्य वर्ग को केस क्लास से प्राप्त करने के लिए यह ठीक है (और काफी आम है)। –

+0

तो इसका मतलब है कि यदि आप केस कक्षाएं लिखते हैं तो आप प्रभावी रूप से उन वर्गों को सील कर रहे हैं। यह एक साइड इफेक्ट है जिसकी मुझे उम्मीद नहीं थी लेकिन मैं भविष्य में सावधान रहूंगा। – Dave

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