2012-01-11 25 views
6

मैंने एक सिंगलटन कक्षा लागू की है और चेतावनी प्राप्त कर रही है कि एक विधि जिसे मैं लिख रहा हूं वह 'एक सील क्लास में घोषित एक नया संरक्षित सदस्य है।' यह निर्माण को प्रभावित नहीं कर रहा है, लेकिन अगर मैं बाद में समस्याओं का कारण बनता हूं तो मैं वास्तव में चेतावनी को अनदेखा नहीं करना चाहता हूं? मैं समझता हूं कि एक सीलबंद वर्ग एक वर्ग है जिसे विरासत में नहीं लिया जा सकता है - इसलिए इसकी विधियों को ओवरराइड नहीं किया जा सकता है, लेकिन मुझे अभी भी नहीं मिलता है कि निम्न कोड मुझे चेतावनी क्यों देगा (क्या यह सिंगलटन डिज़ाइन के उपयोग के कारण है?):'सीलबंद वर्ग में संरक्षित सदस्य' चेतावनी (एक सिंगलटन वर्ग)

namespace WPFSurfaceApp 
{ 
public sealed class PresentationManager 
{ 
    PresentationManager() 
    { 
    } 

    protected void MethodName() 
    { 
    } 

    public static PresentationManager Instance 
    { 
     get 
     { 
      return Nested.instance; 
     } 
    } 

    class Nested 
    { 
     // Explicit static constructor to tell C# compiler 
     // not to mark type as beforefieldinit 
     static Nested() 
     { 
     } 

     internal static readonly PresentationManager instance = new PresentationManager(); 
    } 
} 

संपादित करें: चेतावनी विधिनाम() विधि के संबंध में है। संपादित करें: सुरक्षित शून्य विधि विधि()

+0

यदि आप 'नेस्टेड' कक्षा 'निजी' बनाते हैं तो क्या होता है? –

+3

मैं वहां कुछ भी सुरक्षित नहीं देख रहा हूं ... –

+0

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

उत्तर

14

चेतावनी इसलिए है क्योंकि protected उस वर्ग में समझ में नहीं आता है जिसे विरासत में नहीं लिया जा सकता है। यह कक्षा के लिए तर्कसंगत रूप से private जैसा ही होगा।

यह कोई त्रुटि नहीं है, लेकिन संकलक इस तथ्य पर आपका ध्यान आकर्षित करने की कोशिश कर रहा है कि protectedprivate के बजाय आपको कोई लाभ नहीं मिलेगा और आप जो भी कर रहे हैं वह नहीं कर रहे हैं (यदि आप इसका इरादा रखते हैं एक उप-वर्ग के लिए दृश्यमान हो, जो एक मुहरबंद वर्ग में मौजूद नहीं हो सकता है)।

तो, हाँ, आप इसे सुरक्षित रूप से अनदेखा कर सकते हैं, लेकिन यह protected सदस्यों को sealed कक्षा में तर्कसंगत रूप से असंगत है।

MSDN एंट्री के लिए Compiler Warning CS0628

+0

धन्यवाद जेम्स, अब मैं इसे समझता हूं। यह सिर्फ इतना है कि इसे किसी भी बच्चे वर्ग से बचाने की कोई समझ नहीं है क्योंकि इसमें कोई नहीं होगा। सोचा था कि यह किसी ऐसी चीज़ के लिए चेतावनी हो सकती है जो व्यर्थ कोडिंग के विपरीत गलत हो सकती थी। शायद यह पता होना चाहिए था। मैं उलझन में आया क्योंकि कई बिल्डों के बाद भी, जब भी मैं इसे सार्वजनिक रूप से बदल दूंगा, चेतावनी अभी भी वहां थी। धन्यवाद दोस्त। –

4

यह है क्योंकि यह किसी भी मतलब नहीं है स्पष्ट है। वर्ग

विरासत में मिला नहीं जा सकता है, तो MSDN के रूप में क्या संरक्षित सदस्य के उपयोग किया जाएगा कहते हैं

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

2

इस बारे में सोचें कि आप स्वयं कोड की समीक्षा करते हैं। आप ऐसा कुछ देखते हैं जो आपको समझ में नहीं आता है। कुछ संभावित संभावनाएं हैं:

  1. डेवलपर ने कुछ मूर्खतापूर्ण काम किया है।
  2. डेवलपर ने आपके उद्देश्य के लिए स्पष्ट होने के लिए कुछ चालाक किया है।
  3. डेवलपर ने कुछ उचित किया है जो औसत समय में किए गए परिवर्तनों के कारण अब समझ में नहीं आता है।
  4. डेवलपर ने ऐसा कुछ किया जो अभी तक कोई समझ नहीं आता है, लेकिन यदि योजनाबद्ध परिवर्तन होता है तो होगा।

पहले मामले में, उन्हें इसे ठीक करना चाहिए।

दूसरे मामले में, उन्हें इसे दस्तावेज करना चाहिए।

तीसरे मामले में, उन्हें इसे बदलना चाहिए; इससे थोड़ा व्यावहारिक अंतर आएगा लेकिन कोड अधिक समझ में आएगा और इसमें कुछ मामूली प्रदर्शन लाभ हो सकता है।

चौथे मामले में, उन्हें समय के लिए इसे दस्तावेज करना चाहिए, और या तो उस बदलाव को बाद में इसके बजाय जल्दी से बाहर कर देना चाहिए।

किसी भी तरह से, आप उनके साथ चर्चा करना चाहते हैं।

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

0

मैं कहता हूं कि आप सी # के साथ खेल रहे हैं। गंभीरता से !!
एक स्थिर वर्ग में, ऐसा कहा जाता है कि हम संरक्षित सदस्यों को घोषित नहीं कर सकते क्योंकि स्थिर वर्गों को तत्काल नहीं किया जा सकता है। वास्तव में, जब हम स्थिर वर्गों में संरक्षित सदस्यों को लिखते हैं तो यह निर्माण के दौरान एक त्रुटि फेंक देगा।
एक मुहरबंद कक्षा में, यह निर्माण के दौरान एक चेतावनी फेंक देगा। मुझे लगता है कि स्थैतिक वर्गों की तरह, मुहरबंद कक्षाओं को भी एक त्रुटि प्रदान करना चाहिए और चेतावनी नहीं देना चाहिए। यदि यह अंतर वहां होना चाहिए तो क्यों?