2009-04-17 13 views
29

रीशर्पर public कन्स्ट्रक्टर की abstract कक्षा में protected में पहुंचने की सलाह देता है, लेकिन यह इसके पीछे तर्क नहीं बताता है।अमूर्त कक्षाओं पर रचनाकारों को संरक्षित क्यों किया जाना चाहिए, सार्वजनिक नहीं?

क्या आप कुछ प्रकाश डाल सकते हैं?

उत्तर

62

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

+8

दूसरे शब्दों में: आप बेकार कचरे के साथ अन्य लोगों के इंटेलिसेन्स को क्यों प्रदूषित करना चाहते हैं? –

+3

@ एंड्रे कन्स्ट्रक्टर केवल नए और बेस कॉल के लिए इंटेलिजेंस में दिखाते हैं। आम तौर पर अमूर्त वर्गों को सुलभता से पहले नए से फ़िल्टर किया जाता है क्योंकि अमूर्त की जांच करना बहुत आसान और सस्ता है। – JaredPar

+5

तो यह दिया गया है, क्या संकलक लागू नहीं करना चाहिए कि अमूर्त वर्ग ** ** में 'सार्वजनिक 'निर्माता नहीं हो सकते हैं? – Yuck

1

यह ओओ अभ्यास अच्छा है।

public abstract class ExampleAbstractClass 
{ 
    protected ExampleAbstractClass() 
    { 
     // ::: 
    } 
} 

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

+2

जब आप पैरामीटर जोड़ते हैं तो यह अलग-अलग बनाता है? कन्स्ट्रक्टर अभी भी व्युत्पन्न कक्षाओं द्वारा ही बुलाया जाएगा। –

+0

यह सभी उत्तराधिकारी रचनाकारों को उनके हस्ताक्षर में पैरामीटर रखने के लिए मजबूर करेगा, चाहे आवश्यक हो या नहीं। –

+1

@ श्रीकोडोडी: नहीं, ऐसा नहीं है। उत्तराधिकारी कन्स्ट्रक्टर को केवल 'बेस (...)' को कॉल करने और कुछ पास करने की आवश्यकता होती है, लेकिन यह कुछ भी अन्य जगहों से प्राप्त स्थिरांक या मान भी हो सकता है। –

12

यदि आप एक अमूर्त वर्ग पर protected के बजाय निर्माता public बनाते हैं तो यह तकनीकी रूप से कोई फर्क नहीं पड़ता है। कन्स्ट्रक्टर की पहुंच/दृश्यता अभी भी वही है: एक ही कक्षा या व्युत्पन्न कक्षाएं। दो कीवर्ड के सभी उद्देश्यों और उद्देश्यों के लिए अलग-अलग प्रभाव पड़ते हैं।

तो, यह विकल्प केवल शैली का मामला है: ऑब्जेक्ट ओरिएंटेड समझदार लोगों को संतुष्ट करने के लिए protected टाइप करें।


प्रतिबिंब डिफ़ॉल्ट रूप से केवल निर्माता शामिल होंगे जब यह public है, लेकिन आपको लगता है कि निर्माता वैसे भी फोन नहीं कर सकते हैं।

टाइप करते समय IntelliSense public कन्स्ट्रक्टर दिखाएगा, लेकिन आप उस कन्स्ट्रक्टर को वैसे भी कॉल नहीं कर सकते हैं।

असेंबली का मेटाडाटा इस तथ्य को प्रतिबिंबित करेगा कि निर्माता सार्वजनिक या संरक्षित है।

+0

सिवाय इसके कि दृश्यता 'सार्वजनिक' के रूप में बताई गई सत्य नहीं है। –

+1

उसका उत्तर उन दोनों के बीच कार्यात्मक मतभेद देता है जो वास्तव में मैं देख रहा था। चाहे यह सच है, कोई फर्क नहीं पड़ता, और इसके अलावा सी # भाषा के लिए डेवलपर्स नहीं, इसके लिए एक मुद्दा है। – aaaaaa

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

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