2011-06-03 10 views
7

में वैल चर को ओवरराइड करना चाहिए, मुझे स्कैला में एक अजीब समस्या मिलती है। मेरा कोड निम्नलिखित है, कक्षा कर्मचारी वर्ग व्यक्तिस्कैला

लेकिन कोड का यह टुकड़ा संकलित नहीं किया जा सकता है, मैंने स्पष्ट रूप से पहले नाम और अंतिम नाम वैल चर के रूप में परिभाषित किया है। ऐसा क्यों है ? क्या इसका मतलब है कि मुझे बेस क्लास में वैल वैरिएबल ओवरराइड करना है? और उद्देश्य क्या है?

class Person(firstName: String, lastName: String) { 

} 

class Employee(override val firstName: String, override val lastName: String, val depart: String) 
    extends Person(firstName,lastName){ 

} 

उत्तर

10

कन्स्ट्रक्टर के लिए इनपुट पैरामीटर vals नहीं हैं जब तक आप कहते हैं कि वे हैं। और यदि वे पहले से ही हैं, तो उन्हें ओवरराइड क्यों करें?

class Person(val firstName: String, val lastName: String) {} 
class Strange(
    override val firstName: String, override val lastName: String 
) extends Person("John","Doe") {} 
class Employee(fn: String, ln: String, val depart: String) extends Person(fn,ln) {} 

वे Vals नहीं हैं और आप Vals बनाना चाहते हैं, तो आप ओवरराइड करने के लिए की जरूरत नहीं है:

class Person(firstName: String, lastName: String) {} 
class Employee(
    val firstName: String, val lastName: String, val depart: String 
) extends Person(firstName,lastName) {} 
+10

इस उत्तर एक प्रश्न के साथ सवाल का जवाब। जो मैं जवाब देने की कोशिश करूंगा। 'अजीब' वर्ग में 'वैल' के सामने 'ओवरराइड' कहना है कि संकलक को यह बताना है कि आप एक नया क्षेत्र पेश करने का इरादा नहीं कर रहे हैं। 'ओवरराइड' का अर्थ मोटे तौर पर है "यहां मैं कुछ ऐसा घोषित कर रहा हूं जो पहले से ही अभिभावक वर्ग में घोषित किया गया है और विरासत में कुछ ऐसा पेश करने का इरादा नहीं है"। "ओवरराइड" 'वैल' के बिना" कृपया एक सार्वजनिक, रीडोनली फ़ील्ड बनाएं "। हालांकि स्कैला दो वैल फ़ील्ड को समान नाम रखने की अनुमति नहीं देता है। इस प्रकार 'ओवरराइड' अनिवार्य है। –

+0

@TheodoreNorvell - मेरा बिंदु यह माना जाता था कि अगर आप मूल कक्षा को उसी फ़ील्ड के साथ विस्तारित करने जा रहे हैं तो ओवरराइड बनाने के लिए _no reason_ है। बस उन्हें पैरामीटर के रूप में पास करें और superclass vals vals होने दें। –

+0

@RexKerr ठीक है, यह एक अच्छा मुद्दा है। आप पूछ रहे थे, "'ओवरराइड वैल' क्यों है?"; मैं जवाब दे रहा था, "क्यों 'ओवरराइड' दिया गया है कि आपके पास' वैल' है? "। जिस कोड में मैं लिख रहा हूं, मेरे पास एक समान स्थिति थी, लेकिन, मेरे मामले में, सबक्लास एक केस क्लास है और इसलिए कन्स्ट्रक्टर पैरामीटर स्वचालित रूप से एक वैल्यू है। इस मामले में, कंपाइलर एक त्रुटि संदेश देता है जब तक 'ओवरराइड' कीवर्ड वहां न हो और संभवतः सिंटैक्टिक कारणों के लिए, इसे 'वैल' कीवर्ड' की भी आवश्यकता होती है। केवल दो डाउनसाइड्स इन दो अतिरिक्त शब्द हैं और यह फ़ील्ड दो बार शुरू किया गया है। –

0

जब तक मैं अपने इरादे को गलत समझा गया है, यहाँ Person का विस्तार करने का तरीका बताया गया।

Welcome to Scala version 2.8.0.final (Java HotSpot(TM) Client VM, Java 1.6.0_21). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> class Person(firstName: String, lastName: String) 
defined class Person 

scala> class Employee(firstName: String, lastName: String, depart: String) extends Person(firstName, lastName) 
defined class Employee 
6

निर्माता तर्क के बाद से व्यक्ति में कोई वैल/var घोषणा है, और के रूप में व्यक्ति किसी भी हालत वर्ग है, तर्क वर्ग व्यक्ति, केवल निर्माता तर्क का सदस्य होना नहीं होंगे। संकलक आप अनिवार्य रूप से कह रहा है: अरे, तुमने कहा, कि firstName और lastName सदस्यों, जो कर रहे हैं ओवरराइड/कुछ एक आधार वर्ग से विरासत में मिला फिर से परिभाषित - लेकिन जहाँ तक मैं बता सकता है कोई बात नहीं है ...

class Person(val firstName: String, val lastName: String) 
class Employee(fn: String, ln: String, val salary: BigDecimal) extends Person(fn, ln) 

आपको firstName/lastName को यहां ओवरराइड के रूप में घोषित करने की आवश्यकता नहीं है, btw। बस बेस क्लास के कन्स्ट्रक्टर को मान अग्रेषित करना चाल करेगा।

1

तुम भी संभव हो, लक्षण के रूप में अपने सुपर वर्गों की पुनः रचना की सोच सकते हैं। उदाहरण:

trait Person { 
    def firstName: String 
    def lastName: String 
} 

class Employee(
    val firstName: String, 
    val lastName: String, 
    val department: String 
) extends Person 

या यहाँ तक कि

trait Employee extends Person { 
    def department: String 
} 

class SimpleEmployee(
    val firstName: String, 
    val lastName: String, 
    val department: String 
) extends Employee