2012-07-26 40 views
6

मैं जानना चाहता हूं कि एक सिंगलटन वर्ग क्यों सील करनी चाहिए। अगर हम कन्स्ट्रक्टर को निजी के रूप में दे रहे हैं तो हम कक्षा को सही तरीके से प्राप्त करने से रोक सकते हैं? .. नीचे मैं एमएसडीएन से कुछ लाइनों को चिपका रहा हूं। कृपया मुझे कुछ रंग दें ..सिंगलटन कक्षा क्यों सील करनी चाहिए?

इस रणनीति में, उदाहरण पहली बार बनाया गया है जब कक्षा के किसी भी सदस्य का संदर्भ दिया जाता है। सामान्य भाषा रनटाइम वैरिएबल प्रारंभिकता का ख्याल रखता है। वर्ग व्युत्पन्न को रोकने के लिए बंद कर दिया गया है, जो उदाहरण जोड़ सकता है। एक वर्ग मुहरबंद चिह्नित करने के पेशेवरों और विपक्ष की चर्चा के लिए, [Sells03] देखें। इसके अतिरिक्त, चर को केवल पढ़ने के लिए चिह्नित किया गया है, जिसका अर्थ यह है कि इसे केवल स्थिर प्रारंभिक (जो यहां दिखाया गया है) या कक्षा निर्माणकर्ता के दौरान असाइन किया जा सकता है।

http://msdn.microsoft.com/en-us/library/ff650316.aspx

उत्तर

0

इस डिजाइन दिशा निर्देशों जो, जाहिर है, आप का पालन करें या नहीं कर सकते हैं की तरह है। यह भविष्य में संभावित गड़बड़ी से बचने के लिए abstract के रूप में चिह्नित बेस क्लास के मामले में आपके डिज़ाइन के इरादे को चिह्नित कर रहा है।

2

sealed कीवर्ड का अर्थ है कि कक्षा से विरासत में नहीं लिया जा सकता है। कन्स्ट्रक्टर का निजीकरण घोषित करना मतलब है कि कक्षा के उदाहरण नहीं बनाए जा सकते हैं।

ये वही बात नहीं हैं। आपके पास एक निजी कन्स्ट्रक्टर के साथ बेस क्लास हो सकता है, लेकिन फिर भी उस बेस क्लास से प्राप्त होता है, कुछ सार्वजनिक रचनाकारों को परिभाषित करता है, और प्रभावी रूप से उस बेस क्लास को तुरंत चालू करता है।

याद रखें कि कन्स्ट्रक्टर विरासत में नहीं हैं (इसलिए व्युत्पन्न कक्षा में सभी निजी रचनाकार नहीं होंगे क्योंकि बेस क्लास करता है), और व्युत्पन्न कक्षाएं हमेशा बेस क्लास कन्स्ट्रक्टर को कॉल करती हैं। कक्षा sealed को चिह्नित करने से किसी को आपकी सावधानी से निर्मित सिंगलटन कक्षा के आसपास काम करने से रोकता है क्योंकि यह किसी को कक्षा से विरासत में रखने से रोकता है।

+0

यदि आप व्युत्पन्न वर्ग के पास निजी कन्स्ट्रक्टर * तक पहुंच है तो आप केवल बेस क्लास * से प्राप्त कर सकते हैं। मेरे उत्तर को एकमात्र तरीके से देखें जिसमें यह व्यवहार्य है। BaseClass { सार्वजनिक शून्य प्रदर्शन() { कंसोल: –

+0

हालांकि मैं {() { } निजी BaseClass} वर्ग derrived निम्नलिखित कोड वर्ग BaseClass निर्माण करने में सक्षम नहीं हूँ।लिखित रेखा ("वंचित कक्षा में"); } } और मुझे बेसक्लस.बेस क्लास() 'जैसे त्रुटि प्राप्त हो रही है इसके सुरक्षा स्तर – Anish

10

यदि हम निर्माता को निजी के रूप में दे रहे हैं तो हम कक्षा को सही तरीके से प्राप्त करने से रोक सकते हैं?

नहीं काफी:

public class NotReallySingleton 
{ 
    private NotReallySingleton() {} 

    public class CursesFoiledAgain : NotReallySingleton 
    { 
    } 
} 

... 

NotReallySingleton x = new CursesFoiledAgain(); 
NotReallySingleton y = new CursesFoiledAgain(); 

यह काम करता है क्योंकि private पहुँच कार्यक्रम पाठ प्रकार के नेस्टेड प्रकार सहित, तक सीमित है। तो CursesFoiledAgain के पास NotReallySingleton के निजी निर्माता का उपयोग है।

लेकिन फिर भी sealed के माध्यम से एक तरफ इस छोड़ रहा है, अगर आपके इरादा कि कोई वर्ग से निकाले जाते हैं कर सकते हैं, तुम क्यों के रूप में स्पष्ट रूप से संभव के रूप में है कि इरादा संकेत करने के लिए नहीं करना चाहते?

+0

सी # ज्ञान की कमी को क्षमा करें, लेकिन' शापित नहीं है 'को' NotReallySingleton' 'बढ़ाने की आवश्यकता नहीं है, या यह उल्लिखित है जावा में विपरीत एक नेस्टेड प्रकार होने के नाते? –

+0

@ डेविड हार्नेसनेस: क्षमा करें, नहीं - वह एक टाइपो था। इसे स्पष्ट रूप से किया जाना है, जिसे मैं अभी ठीक कर दूंगा :) –