2012-04-13 21 views
11

मुझे यह जानने की ज़रूरत है कि किसी वर्ग को .NET में Instantiated होने से कैसे रोकें?कक्षा को तत्काल होने से रोकने का सबसे अच्छा तरीका?

मुझे कक्षा सार और स्टेटिक बनाने जैसी कुछ विधियां पता हैं।

क्या यह हासिल करने के लिए कोई और तरीका है?

+0

क्यों नहीं – Trikaldarshi

+3

"तत्काल होने की अनुमति नहीं है" 'स्थिर वर्ग 'की सटीक परिभाषा है। आपको कुछ और क्यों चाहिए? –

उत्तर

6

निर्माता private चिह्नित करना। बेशक, यह वर्ग को static विधि के माध्यम से तुरंत चालू करने से नहीं रोकता है, उदाहरण के लिए ...

अधिक व्यावहारिक रूप से, कक्षा तत्काल अस्वीकार करने का उद्देश्य क्या है। यदि यह सिंगलटन है, तो private कन्स्ट्रक्टर उचित है। यदि यह सबक्लासिंग को मजबूर करना है, तो वर्ग abstract बनाना बेहतर है; यदि यह उपयोगिता विधियों के साथ एक वर्ग है, तो इसे static बनाना एक तरीका है (फिर आप केवल static विधियां कर सकते हैं)।

+1

मैंने ऐसा किया लेकिन यह अभी भी काम नहीं कर रहा है, मैं obj बनाने में सक्षम हूं। –

+2

@RomeshSomani यह इस बात पर निर्भर करता है कि आप कहां से उदाहरण बनाने की कोशिश कर रहे हैं। इसे पूरी तरह से इनकार करने की आवश्यकता है, इसे सार बनाएं। संपादित करें - क्षमा करें, मेरा मतलब स्थिर है। – asawyer

+0

नहीं, अमूर्त का एक अलग उद्देश्य है। इसे स्थिर बनाओ। –

14

मार्क निर्माता (रों) private, protected या किसी अन्य विधानसभा से इस्तेमाल किया में अगर, internal

+5

इसे अभी भी प्रतिबिंब का उपयोग करके तत्काल किया जा सकता है। और यदि यह मुहरबंद नहीं है, तो आप इसे से प्राप्त कर सकते हैं, और उसके बाद संरक्षित कन्स्ट्रक्टर का उपयोग कर सकते हैं जिसका अब आपके पास पहुंच है। – jason

+0

@ जेसन वे अच्छे अंक हैं! – asawyer

3

I need to know how to prevent a class from being Instantiated in .net?

आपका प्रश्न स्पष्ट नहीं है।

क्या आपका मतलब रनटाइम पर तत्काल है? कक्षा abstract या static बनाएं।

क्या आपका मतलब है कि निर्माता कोड में पहुंच योग्य नहीं है? निर्माता private बनाओ। लेकिन ध्यान दें कि कोई भी कन्स्ट्रक्टर पर हैंडल पकड़ने के लिए प्रतिबिंब का उपयोग कर सकता है और रनटाइम पर एक इंस्टेंस चालू कर सकता है।

तो, आपका क्या मतलब है?

+0

मैं प्रतिबिंब, अच्छा बिंदु के बारे में भूल गया। – asawyer

+0

मैंने एक निजी कन्स्ट्रक्टर के साथ एक्टिवेटर। क्रिएट इंस्टेंस का उपयोग करने की कोशिश की और यह एक अपवाद उठाया –

+0

@AdrianIftode यह देखने के लिए जांचें कि क्या आपकी बाइंडिंग निजी सदस्यों को खींच रही है या नहीं। – asawyer

19

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

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

ओह, और, बनाने वर्ग स्थिर कक्षा में किसी भी व्यर्थ उदाहरण के सदस्यों को शुरू करने से आप बंद हो जाएगा भी :)

स्थिर कक्षाओं के बारे में अधिक जानकारी के लिए MSDN देखें।

+0

स्थैतिक वर्गों के बारे में उत्सुक बात, वे [कक्षाओं की तरह दिखते हैं] नहीं हैं (http://codecrafter.blogspot.ca/2009/09/c-static-classes-are-not-real-classes.html); वे मॉड्यूल के समान हैं ... –

2

तो सवाल यह है:

How can you make your class not be instanced without having your class be static or abstract ?

तो इसका जवाब है, जिसमें singleton pattern लागू करने के लिए, है।

public sealed class myClass 
{ 
    private static readonly Lazy<myClass> lazyInstance = 
     new Lazy<myClass>(() => new myClass()); 

    public static Instance 
    { 
     get 
     { 
      return lazyInstance.Value; 
     } 
    } 

    private myClass() 
    { 
     // constructor logic here 
    } 
} 

सिंगलटन पैटर्न आप अपने वर्ग, जबकि अभी भी सुनिश्चित आप केवल अपने वर्ग का एक उदाहरण है, तरीकों के लिए एक संदर्भ के रूप में चारों ओर पारित करने के लिए अनुमति देता है: नेट 4 इस के साथ आसानी से किया जाता है। यह परीक्षण को बहुत आसान बनाता है क्योंकि आपके पास ImyClass उदाहरण हो सकता है जो myClass लागू करता है, यह नकली वस्तुओं को बनाते समय बहुत उपयोगी होता है।

.NET4 बिना आप अभी भी सिंगलटन पैटर्न लागू कर सकते हैं उदाहरण के लिए:

private static readonly myClass instance = new myClass(); 

public static Instance 
{ 
    get 
    { 
     return instance; 
    } 
} 

// rest of code remains the same 

है कौन सा लोड हो रहा है आस्थगित नहीं है जब तक यह कहा जाता है, वहाँ अन्य तरीकों के बहुत सारे के रूप में अच्छी तरह से (मैं के बारे में 6 अलग अलग तरीकों से लगता है), लेकिन उपर्युक्त दो सबसे आम हैं।

सारांश में सवाल यह पूछने की संभावना है कि क्या आप सिंगलटन पैटर्न जानते हैं और यदि आप यूनिट परीक्षणों और नकली वस्तुओं के लिए स्थिर वर्गों पर इसका महत्व पहचानते हैं।

दूसरों के रूप में पहले से ही, static क्षेत्रों, यहां तक ​​कि उन चिह्नित readonly प्रतिबिंब के साथ सेट किया जा सकता ने बताया है, इसके अलावा में private निर्माता प्रतिबिंब का उपयोग कर कहा जा सकता है। यदि आपको इन्हें रोकने की आवश्यकता है, तो आपको कॉलिंग कोड को कम विश्वसनीय ऐप-डोमेन स्पेस में चलाने की आवश्यकता है, या आपको अपनी कक्षा को static के रूप में लागू करने की आवश्यकता होगी।

आम तौर पर, लोग आपकी बाधाओं को पाने के लिए प्रतिबिंब के ऐसे स्तरों से परेशान नहीं होते हैं, जब तक कि उन्हें 'वास्तव में' की आवश्यकता नहीं होती है, अस्पष्ट/चरम सीमा मामले इकाई परीक्षण लिखते हैं।

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

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