2012-01-20 19 views
17

क्या कारण F # नेस्टेड कक्षाओं तकनीकी, स्टाइलिस्ट, मनमाने ढंग से समर्थन नहीं करता है?एफ # नेस्टेड कक्षाओं का समर्थन क्यों नहीं करता है?

प्रतिबिंबक में बीसीएल पर चमकते हुए, नेस्टेड कक्षाओं का उपयोग गणक, DynamicMetaObject एस, और शायद कुछ अन्य चीजों के लिए किया जाता है।

जो इस सुविधा के साथ F # के बारे में मेरी जिज्ञासा को पिक्चर करता है। मुझे पता है कि एक ही काम करने के अन्य तरीके हैं। मैं ज्यादातर उत्सुक हूँ।

+6

यह नेस्टेड (स्थैतिक) वर्गों का समर्थन करता है: 'मॉड्यूल एक्स = मॉड्यूल वाई = जे = 3;; –

उत्तर

19

मुझे लगता है कि नेस्टेड कक्षाएं .NET ऑब्जेक्ट मॉडल की मुख्य विशेषता नहीं थीं और इसे संसाधनों को बचाने के लिए बस गिरा दिया गया था। कुछ तकनीकी कठिनाइयों (यानी दृश्यता या पुनरावर्ती प्रकार परिभाषाओं के साथ) हो सकती है, लेकिन मुझे नहीं लगता कि यह एक बड़ी समस्या होगी।

कई मामलों ऐसे ही एक iterators के रूप में सी # में नेस्टेड कक्षाएं, जहां का प्रयोग करेंगे, तो आप अच्छी तरह से वस्तु भाव का उपयोग कर सकते

, इसलिए मुझे लगता है कि वे नेस्टेड वर्गों के लिए कुछ तरीके प्रतिस्थापन में हैं:

type Collection() = 
    member x.GetEnumerator() = 
    let n = ref 0 
    { new IEnumerator with 
     member x.Current = box n.Value 
     member x.MoveNext() = incr n; true 
     member x.Reset() = n := 0 } 

हालांकि यह है नेस्टेड कक्षाओं के समान ही, इसे नेस्टेड क्लास के रूप में संकलित नहीं किया गया है और ऑब्जेक्ट अभिव्यक्ति का शरीर Collection के निजी सदस्यों तक नहीं पहुंच सकता है। मैं समर्थन कर लगता है कि यह, भाव थोड़ा के संकलन को मुश्किल है क्योंकि वस्तु भाव एक वर्ग संदर्भ के बाहर दिखाई दे सकता है कि ...

वास्तव में, यह वस्तु अभिव्यक्ति से private सदस्यों तक पहुँचने के लिए संभव है, हालांकि अभी भी कोड नहीं है एक घोंसला वर्ग के रूप में संकलित। विवरण के लिए टिप्पणियां देखें।

+1

एक छोटा सुधार: यह ऑब्जेक्ट अभिव्यक्ति से संलग्न प्रकार के 'let' बाइंडिंग/निजी सदस्यों को संदर्भित करने के लिए _is_ संभव है। यह, मेरे विचार में, उन्हें नेस्टेड कक्षाओं से बेहतर समाधान बनाता है। – Daniel

+1

@ डैनियल आप सही हैं - आप निजी सदस्यों तक पहुंच सकते हैं (मेरे पास मेरे परीक्षण में एक बग था)। दिलचस्प बात यह है कि, जब आप ऐसा करते हैं, तो जिस सदस्य को आप एक्सेस कर रहे हैं वह या तो इस पहुंच को सुरक्षित बनाने के लिए 'आंतरिक' के रूप में रेखांकित या संकलित किया गया है (लेकिन एफ # कंपाइलर इसे 'निजी' के रूप में मानता है)। –

+3

@ टॉमस: दरअसल, एफ # विनिर्देश के अनुसार, "_L_ गैर-सार्वजनिक संस्थाओं का सीएलआई संकलित रूप आंतरिक है।" ... यही कारण है कि किसी को गैर-एफ # क्लाइंट [] विशेषाधिकार नहीं देना चाहिए ... वे F # असेंबली में _private_ में _private_ जैसी सभी चीज़ें देखेंगे _internal_! –

2

एफ # काफी हद तक कैमल पर आधारित है, जिसमें घोंसला वाले वर्ग नहीं हैं।

शायद यह केवल इसलिए नहीं जोड़ा गया क्योंकि यह बहुत उच्च प्राथमिकता नहीं है। चूंकि आप डेटा प्रकारों की घोषणा कर सकते हैं जो मॉड्यूल के बाहर दिखाई नहीं दे रहे हैं, जिससे आंतरिक कक्षाएं आपके कोड को कितनी अच्छी तरह से एन्सेप्लेटेड करने में अंतर डालती हैं।

+10

यह संभवतः मामला नहीं है - हालांकि एफ # मोटे तौर पर ओकैम पर आधारित है, एफ # में प्रयुक्त ऑब्जेक्ट मॉडल बहुत अधिक है OCaml की तुलना में .NET पर आधारित है। –

+0

+1 यह उल्लेख करने के लिए कि वे अनावश्यक हैं क्योंकि आप उन्हें छिपाने के लिए हस्ताक्षर फ़ाइलों का उपयोग कर सकते हैं। – YellPika

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