2011-02-11 19 views
11

मैं सी # सीख रहा हूं और जावा दुनिया से आ रहा हूं, मैं थोड़ा उलझन में था कि सी # में "पैकेज निजी" नहीं है। इस राशि के बारे में मैंने जो अधिक टिप्पणियां देखी हैं, "आप इसे नहीं कर सकते; भाषा इस तरह से डिजाइन नहीं की गई थी"। मैंने कुछ वर्कअराउंड भी देखे जिनमें internal और partial शामिल थे, जिसमें टिप्पणियां थीं कि ये कामकाज भाषा के डिजाइन के खिलाफ जाते हैं।सी # पैकेज निजी क्यों नहीं है?

सी # इस तरह से डिजाइन क्यों किया गया था? साथ ही, मैं निम्न जैसा कुछ कैसे करूं: मेरे पास Product वर्ग और ProductInstance कक्षा है। एकमात्र तरीका है जिसे मैं ProductInstance बनाया जाना चाहता हूं Product कक्षा में फैक्ट्री विधि के माध्यम से। जावा में, मैं ProductInstance को उसी पैकेज में Product के रूप में रखूंगा, लेकिन इसके कन्स्ट्रक्टर package private बना सकता हूं ताकि केवल Product तक इसका उपयोग हो सके। इस तरह, कोई भी जो ProductInstance बनाना चाहता है, केवल Product कक्षा में फ़ैक्टरी विधि के माध्यम से ऐसा कर सकता है। मैं सी # में एक ही चीज़ कैसे पूरा करूं?

+1

उत्पाद कक्षाएं निर्माता निजी बनाएं, फिर एक सार्वजनिक स्टेटिक फ़ंक्शन है जो उत्पाद प्रविष्टि देता है, उदाहरण के लिए: var p = product.GetProductInstance –

+1

उत्तर देखकर, मुझे इसका कोई जवाब नहीं दिख रहा है। मुझे लगता है कि यह एक विधि 'आंतरिक' सेटिंग सेट करने वाला एक बड़ा कोड गंध है जहां इसका उपयोग केवल कुछ "अनुकूल" वर्गों द्वारा किया जाना है (सी ++ में 'मित्र' कीवर्ड देखें)। मैं बदबूदार पहुंच को रोकने के लिए सैकड़ों डीएल में अपना आवेदन तोड़ना नहीं चाहता हूं, न ही मैं अपना विस्तार कार्यान्वयन खुला छोड़ना चाहता हूं (मूल रूप से पूरी देव टीम के लिए सार्वजनिक)। क्या मुझे इस सीमा को दूर करने के लिए दस उप-वर्गों के साथ विशाल कक्षाएं लिखनी चाहिए? – PPC

उत्तर

25

internal वह है जो आप के बाद हैं। इसका मतलब है कि सदस्य एक ही विधानसभा में किसी भी वर्ग द्वारा सुलभ है। इस उद्देश्य के लिए इसका उपयोग करने में कुछ भी गलत नहीं है (उत्पाद & उत्पाद इंस्टेंस), और यह उन चीजों में से एक है जिनके लिए इसे डिज़ाइन किया गया था। सी # ने नेमस्पेस को महत्वपूर्ण बनाने के लिए चुना नहीं है - उनका उपयोग संगठन के लिए किया जाता है, यह निर्धारित करने के लिए कि किस प्रकार एक दूसरे को देख सकते हैं, जैसे पैकेज निजी के साथ जावा में।

partial बिल्कुल internalयाpackage private ऐसा कुछ नहीं है। यह एक वर्ग के कार्यान्वयन को कई फ़ाइलों में विभाजित करने का एक तरीका है, अच्छे माप के लिए कुछ विस्तारशीलता विकल्पों को फेंक दिया गया है।

+0

तो मुझे केवल 'ProductInstance' के कन्स्ट्रक्टर को' आंतरिक 'के रूप में चिह्नित करने की आवश्यकता है? –

+0

@ विविन, हां, और संभवतः कक्षा भी। –

+0

नहीं, केवल एक कारखाने वर्ग के लिए एक असेंबली बनाना बुरा सलाह है। सैकड़ों असेंबली होने से एक परियोजना को प्रबंधित करना मुश्किल हो जाता है। – miguel

7

पैकेज वास्तव में जावा में किए गए तरीके से मौजूद नहीं होते हैं। नामस्थान का उपयोग कोड व्यवस्थित करने और नामकरण संघर्ष को रोकने के लिए किया जाता है, लेकिन एक्सेस नियंत्रण के लिए नहीं। परियोजनाओं/असेंबली का उपयोग अभिगम नियंत्रण के लिए किया जा सकता है, लेकिन आपके पास पैकेजों के साथ घोंसला वाली परियोजनाएं/असेंबली नहीं हो सकती हैं।

एक परियोजना के सदस्यों को दूसरे से छिपाने के लिए internal का उपयोग करें।

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