स्काला में निजी और संरक्षित निर्माणकर्ता


109

मैं स्कैला में एक स्पष्ट प्राथमिक कंस्ट्रक्टर नहीं होने के प्रभाव के बारे में उत्सुक हूं, बस वर्ग निकाय की सामग्री।

विशेष रूप से, मुझे संदेह है कि निजी या संरक्षित कंस्ट्रक्टर पैटर्न, यानी साथी ऑब्जेक्ट या किसी अन्य वर्ग या ऑब्जेक्ट के तरीकों के माध्यम से निर्माण को नियंत्रित करना एक स्पष्ट कार्यान्वयन नहीं हो सकता है।

क्या मै गलत हु? यदि हां, तो यह कैसे किया जाता है?


आपके पास एक स्काला सिंगलटन हो सकता है (ऑब्जेक्ट कीवर्ड के साथ, वह है), और उस सिंगलटन के भीतर अपनी कक्षा को निजी के रूप में परिभाषित करें, और आपकी वस्तुओं के निर्माण के लिए सिंगलटन के तरीके हैं।
17

@Paggas, दुर्भाग्यवश जब आप किसी वर्ग के एक उदाहरण को निजी रूप से वापस लौटाते हैं, तो वह गुंजाइश नहीं होगी, जब वह गुंजाइश साथी वस्तु में से एक विधि से वापस आती है।
डॉन मैकेंजी

यह स्कैलाज़ स्रोत कोड भर में काफी गहराई से किया जाता है। अवधारणा को एक अमूर्त बीजीय डेटा प्रकार के रूप में भी जाना जाता है ।
टोनी मॉरिस

जवाबों:


190

आप डिफ़ॉल्ट निर्माता को निजी / संरक्षित घोषित कर सकते हैं जैसे कि वर्ग नाम और पैरामीटर सूची के बीच उपयुक्त कीवर्ड डालकर:

class Foo private () { 
  /* class body goes here... */
}

धन्यवाद अलेक्जेंडर, क्या आप मुझे बता सकते हैं कि क्या यह एक स्केला किताबों में या भाषा विनिर्देश में प्रस्तुत किया गया है? क्षमा करें, मैं अभी तक नहीं बढ़ा सकता।
डॉन मैकेंजी

मैं बस निर्माणकर्ताओं के "प्रोग्रामिंग स्कैला" विवरण (पृष्ठ 92-95) पर नज़र रखता था और मुझे वहाँ इसका उल्लेख नहीं दिखता। मुझे वास्तव में एक पुराने चैंज में आपके प्रश्न का उत्तर मिला, लेकिन मैंने इसे पहले कहीं और उल्लेख नहीं किया है। लिंक: scala-lang.org/node/43#2.4.0
अलेक्जेंडर केमेटेक

18
पैग 414 "स्काला में प्रोग्रामिंग"। Wampler के प्रोग्रामिंग स्कैला के पृष्ठ 97। सुब्रमण्यम के प्रोग्रामिंग स्कैला का पेज 60। मेरे पास अभी शुरुआत की एक पीडीएफ नहीं है, इसे जाँचने के लिए अभी मेरे पास है।
डैनियल सी। सोबरल

ओह, मैं इसे अब पृष्ठ 97 पर देखता हूं। धन्यवाद।
अलेक्जेंडर केमेटेक

1
आगे के शोध के लिए दोनों को धन्यवाद, मुझे वैंपलर किताब मिल गई है, लेकिन केवल मेरे फोन पर और स्पष्ट रूप से इसे पूरी तरह से पढ़ा नहीं है, लेकिन मैंने पाया है कि यह ओडस्की पुस्तक को आश्चर्यजनक रूप से अच्छी तरह से पूरक करता है।
डॉन मैकेंजी

64

अलेक्जेंडर का जवाब सही है, लेकिन स्काला में प्रोग्रामिंग एक अतिरिक्त विकल्प प्रदान करता है:

sealed trait Foo {
 // interface
}

object Foo {
  def apply(...): Foo = // public constructor

  private class FooImpl(...) extends Foo { ... } // real class
}

18
कहने के लिए वर्षों बाद में रोकना: मुझे लगता है कि यह सवाल का एक अच्छा जवाब है लेकिन समस्या का एक बुरा समाधान है। अगर कुछ भावी प्रोग्रामर अलेक्जेंडर के कोड में थे, तो वे कहेंगे "आह, प्राथमिक निर्माता निजी है लेकिन अन्य निर्माता नहीं हैं।" अगर वह प्रोग्रामर डैनियल के कोड को देखता, तो वह कहता, "आह, वे डिफ़ॉल्ट निर्माताओं को निजी के रूप में चिह्नित करने के लिए स्काला की अक्षमता की भरपाई के लिए एक फैक्ट्री पैटर्न का उपयोग कर रहे हैं। रुको, स्काला के डिफ़ॉल्ट निर्माणकर्ताओं को निजी के रूप में चिह्नित कर सकते हैं ! क्या हो रहा है!" यहा पर?!?" दूसरे शब्दों में, एक खराब डब्ल्यूटीएफ / एलओसी अनुपात।
मालवोलियो

20
@ मालवोलियो मैं काफी सहमत नहीं हूं। यह पैटर्न न केवल प्राथमिक कंस्ट्रक्टर को निजी बनाता है, बल्कि कार्यान्वयन , उपयोगकर्ता को इंटरफ़ेस (विशेषता) का उपयोग करने के लिए मजबूर करता है। इसका अपना मूल्य है। किसी के लिए कुछ सोचने के कारण क्योंकि वह / वह भाषा नहीं जानता - झगड़ा! केनी टिल्टन को उद्धृत करने के लिए, लानत भाषा सीखें !
डैनियल सी। सोबरल जूल

7
यह कहीं उल्लेख किया जाना चाहिए कि इस दृष्टिकोण का अर्थ है कि newकीवर्ड का उपयोग नहीं करना ।
ट्रैविस पार्क

1
इस दृष्टिकोण के साथ एक चेतावनी यह है कि कोई अभी भी अपने स्वयं के कार्यान्वयन के माध्यम से एक फू को रोक सकता है। निर्माण को नियंत्रित करने के कारण के आधार पर इसे एक लाभ या हानि के रूप में देखा जा सकता है।
ऐज

1
@ वैज ट्रू, इसलिए मैंने इसे सिर्फ इसलिए बनाया ताकि अब ऐसा न हो सके। :)
डैनियल सी। सोबरल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.