2010-02-24 9 views
8

डिफ़ॉल्ट निर्माता पैरामीटर के लिए एक्सेसर विधि, यानी परिभाषित करने के लिए कोशिश कर रहा है:डिफ़ॉल्ट कन्स्ट्रक्टर पैरामीटर के लिए एक्सेसर विधि को कैसे परिभाषित किया जाए?

class Person (age: Int) { 
    def age: Int = this.age 
} 

कौन सा स्पष्ट रूप से एक संकलक त्रुटि में परिणाम है: अतिभारित परिभाषा को अस्पष्ट संदर्भ, type => इंट और मूल्य के स्तर के व्यक्ति में दोनों विधि उम्र कक्षा में आयु इंट मिलान अपेक्षित प्रकार Int

क्या सदस्य संदर्भ नाम और स्वत: जेनरेट किए गए सदस्य मूल्य नाम के बीच अंतर करने के लिए इस संदर्भ में कोई तरीका है?

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

उत्तर

16

बस कन्स्ट्रक्टर पैरामीटर के सामने "वैल" डालें जिसे आप उदाहरण गुणों के रूप में बेनकाब करना चाहते हैं।

+0

धन्यवाद! बस इसे खुद समझ लिया।:-) लेकिन अगर मैं डिफ़ॉल्ट एक्सेसर को ओवरराइड करना चाहता हूं तो क्या होगा? मुझे लगता है कि मुझे अभी भी पैरामीटर का नाम बदलने की आवश्यकता है? –

+3

हां, आपको परम नाम (उदा। 'आयु 0') का नाम बदलने की आवश्यकता है, फिर एक्सेसर' def age = {Math.abs (age 0) को परिभाषित करें। – retronym

6

उपयोग

class Person (val age: Int) 

अगर आप सिर्फ एक गेटर या

class Person (var age: Int) 

चाहते हैं, तो आप भी एक सेटर चाहते हैं।

3

उपर्युक्त उत्तर समान पहुंच सिद्धांत हैं। यदि आपके पास जावा स्टाइल गेटर्स और सेटर्स की आवश्यकता है या आप बीनप्रोपर्टी एनोटेशन का भी उपयोग कर सकते हैं।

class Person(@scala.reflect.BeanProperty var age: Int) 

यह परिणाम होगा निम्न विधियों में बनाया जा रहा:

def getAge: Int = age 
def setAge(age: Int) = this.age = age 

आप के बजाय एक वर के बजाय एक वैल के लिए BeanProperty उपयोग करते हैं, सेटर नहीं बनाया जाएगा, केवल गेटर।

एक अन्य चेतावनी, सेटर विधि को स्कैला के अंदर से नहीं बुलाया जा सकता है। इसके बजाय, आपको मूल्य निर्धारित करने के लिए वर्दी पहुंच के मानक स्कैला सम्मेलन का उपयोग करना चाहिए।

1

बस पूर्णता के लिए और पिछले उत्तरों पर विस्तार करने के लिए, तकनीक भी here को कवर किया गया है।

संक्षेप में, मैं हमेशा अपरिवर्तनीय मूल्य के साथ शुरू होगा:

: फिर

class Person (val age: Int) 

, अगर आप यह पता लगाने आप (या आप पहले से यह पता) मूल्य उत्परिवर्तित की जरूरत है, करने के लिए स्विच

:
class Person (var age: Int) 

फिर, अगर आप को मान्य या प्राप्त पर कुछ अन्य गणना करते हैं या निर्धारित करने की आवश्यकता है, अपने चर नाम बदलने और accessors कि अपने मूल नामकरण की नकल का निर्माण, कोड के बाकी refactor करने के लिए कोई जरूरत नहीं

बेशक, यदि आप वहां संचालन की आवश्यकता नहीं है तो आप या तो सेटटर या गेटर को सरल बना सकते हैं।

अन्य सभी उत्तरों के लिए कुडोस, जो वास्तव में सही हैं और बहुत जल्द आए हैं।

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

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