2010-04-18 16 views
18

बस सोच रहा है कि यह संभव है या नहीं। जो मैं वास्तव में करना चाहता हूं वह वैल के रूप में संग्रहीत होने से पहले तर्कों में से एक को संभवतः संशोधित करता है।स्कैला: क्या डिफ़ॉल्ट केस क्लास कन्स्ट्रक्टर को ओवरराइड करना संभव है?

वैकल्पिक रूप से, मैं एक अधिभार का उपयोग कर सकता हूं और डिफ़ॉल्ट कन्स्ट्रक्टर निजी बना सकता हूं। इस मामले में मैं साथी ऑब्जेक्ट में निजी फैक्ट्री कन्स्ट्रक्टर को भी निजी बनाना चाहता हूं, मैं यह कैसे करूँगा?

बहुत धन्यवाद।

एडम

संपादित करें: अच्छी तरह से मैं पता लगा है कि बनाने डिफ़ॉल्ट निर्माता निजी भी डिफ़ॉल्ट कारखाना निर्माता निजी बना देता है, तो मैं एक समाधान है, मैं अगर डिफ़ॉल्ट निर्माता हालांकि overridable है

पता करने के लिए अभी भी इसमें रुचि है
+3

आप ऐसा क्यों करना चाहते हैं? एक केस क्लास का उपयोग बीजगणित डेटा प्रकारों को परिभाषित करने के लिए किया जाता है, इसलिए एक अतिरिक्त कन्स्ट्रक्टर जो कॉलर के तर्कों को थोड़ा झूठ बोलता है। जहां तक ​​तर्कों को मान्य किया जाता है, वह 'कन्स्ट्रर्ट' या 'आवश्यकता' का उपयोग करके प्राथमिक कन्स्ट्रक्टर में किया जा सकता है। –

+0

@ adam77 अपने शुरुआती कथन को एक प्रश्न के रूप में रेफ्रेम करने के लिए, "क्या मैं एक [केस क्लास पैरामीटर] को जांच और संभवतः संशोधित कर सकता हूं?" इसका जवाब है हाँ। मैंने अभी यहां स्थित एक संबंधित प्रश्न पर विवरण पोस्ट किया है: http://stackoverflow.com/a/25538287/501113 – chaotic3quilibrium

उत्तर

11

माध्यमिक मामले वर्ग कंस्ट्रक्टर्स की उपस्थिति संकलक वर्ग के साथी में अतिरिक्त कारखाने तरीकों का उत्पादन करने का कारण नहीं है, ताकि आप उन्हें बनाने के लिए CaseClaseName(«secondary constructor parameter list»>) की सुविधा नहीं मिलेगी। आपको new कीवर्ड का उपयोग करना होगा।

साथी ऑब्जेक्ट में वैकल्पिक फैक्ट्री विधियों में वर्णित तर्क का प्रकार और प्राथमिक कन्स्ट्रक्टर का उपयोग करने के लिए चिपकना बेहतर है।

3

आप कन्स्ट्रक्टर को अधिभारित कर सकते हैं। यह सी ++ या जावा जैसा ही है। बस एक और कन्स्ट्रक्टर बनाओ।

class Foo(_input:Int){ 
    def this() = this(0) 
} 

या आप this अतः पोस्ट देख सकते हैं।

+1

धन्यवाद, लेकिन सवाल ओवरलोड नहीं है ओवरलोड। – adam77

+8

कोई कन्स्ट्रक्टर ओवरराइड नहीं किया जा सकता है, क्योंकि उन्हें प्रारंभ करने के लिए विरासत में नहीं मिला है। –

1

आप साथी ऑब्जेक्ट में अपने apply (कारखाने के लिए) और unapply (पैटर्न मिलान के लिए) लिखकर एक नियमित श्रेणी को छद्म-केस-क्लास में बदल सकते हैं। या, आप केस क्लास के साथी ऑब्जेक्ट में बस नामित फैक्ट्री विधि लिख सकते हैं।

22

आपके पास डिफॉल्ट कन्स्ट्रक्टर अपने पैरामीटर को स्टोर करने के तरीके को बदलने का विकल्प नहीं है (उदाहरण के लिए पैरामीटर को val एस के रूप में संग्रहीत करने से पहले संशोधित करके) लेकिन आपके पास पैरामीटर गलत होने पर अपवाद फेंकने का विकल्प होता है (बाद मापदंडों जमा हो जाती है इस हो जाएगा)

case class Foo(x:Int){ 
    if (x<0) throw SomeException; 
} 

तुम भी अतिरिक्त कंस्ट्रक्टर्स कि पहले निर्माता

case class Foo(x:Int){ 
    def this(x:Int,y:Int) = this(x+y) 
} 

फोन, लेकिन उन कारखाने तरीकों नहीं मिलता लागू करने का विकल्प है।

आप आसानी साथी वस्तु

object Foo{ 
    def apply(x:Int,y:Int) = new Foo(x,y) 
} 

कुछ भी बाकी है कि तुलना में अधिक जटिल में जोड़कर कारखाने विधि अपने आप बना सकते हैं, और आप मामले वर्ग छोड़ और यह अपने दम पर भागों है लागू करने के लिए है: apply , unapply, equals, और hashCodeस्कैला में प्रोग्रामिंग इन सभी को कैसे करें, equals और hashCode के लिए अच्छे सूत्र प्रदान करने के बारे में बात करते हैं।

+0

केस क्लास में संग्रहीत होने से पहले पैरामीटर को सुरक्षित रूप से बदलना संभव है। और आप अभी भी केस कक्षाओं के सभी लाभों को छोड़ दिए बिना कुछ और जटिल चीजें कर सकते हैं। मैंने अभी एक और धागे पर अपना समाधान विस्तृत किया है: http://stackoverflow.com/a/25538287/501113 – chaotic3quilibrium

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