मुझे यह जानने की ज़रूरत है कि किसी वर्ग को .NET में Instantiated होने से कैसे रोकें?कक्षा को तत्काल होने से रोकने का सबसे अच्छा तरीका?
मुझे कक्षा सार और स्टेटिक बनाने जैसी कुछ विधियां पता हैं।
क्या यह हासिल करने के लिए कोई और तरीका है?
मुझे यह जानने की ज़रूरत है कि किसी वर्ग को .NET में Instantiated होने से कैसे रोकें?कक्षा को तत्काल होने से रोकने का सबसे अच्छा तरीका?
मुझे कक्षा सार और स्टेटिक बनाने जैसी कुछ विधियां पता हैं।
क्या यह हासिल करने के लिए कोई और तरीका है?
निर्माता private
चिह्नित करना। बेशक, यह वर्ग को static
विधि के माध्यम से तुरंत चालू करने से नहीं रोकता है, उदाहरण के लिए ...
अधिक व्यावहारिक रूप से, कक्षा तत्काल अस्वीकार करने का उद्देश्य क्या है। यदि यह सिंगलटन है, तो private
कन्स्ट्रक्टर उचित है। यदि यह सबक्लासिंग को मजबूर करना है, तो वर्ग abstract
बनाना बेहतर है; यदि यह उपयोगिता विधियों के साथ एक वर्ग है, तो इसे static
बनाना एक तरीका है (फिर आप केवल static
विधियां कर सकते हैं)।
मैंने ऐसा किया लेकिन यह अभी भी काम नहीं कर रहा है, मैं obj बनाने में सक्षम हूं। –
@RomeshSomani यह इस बात पर निर्भर करता है कि आप कहां से उदाहरण बनाने की कोशिश कर रहे हैं। इसे पूरी तरह से इनकार करने की आवश्यकता है, इसे सार बनाएं। संपादित करें - क्षमा करें, मेरा मतलब स्थिर है। – asawyer
नहीं, अमूर्त का एक अलग उद्देश्य है। इसे स्थिर बनाओ। –
मार्क निर्माता (रों) private
, protected
या किसी अन्य विधानसभा से इस्तेमाल किया में अगर, internal
I need to know how to prevent a class from being Instantiated in .net?
आपका प्रश्न स्पष्ट नहीं है।
क्या आपका मतलब रनटाइम पर तत्काल है? कक्षा abstract
या static
बनाएं।
क्या आपका मतलब है कि निर्माता कोड में पहुंच योग्य नहीं है? निर्माता private
बनाओ। लेकिन ध्यान दें कि कोई भी कन्स्ट्रक्टर पर हैंडल पकड़ने के लिए प्रतिबिंब का उपयोग कर सकता है और रनटाइम पर एक इंस्टेंस चालू कर सकता है।
तो, आपका क्या मतलब है?
कक्षा स्थिर बनाना सर्वोत्तम तरीका है, यदि आप बिल्कुल किसी भी उदाहरण नहीं चाहते हैं। यह किसी भी उदाहरण बनाने से रोकता है। कक्षा दोनों और अमूर्त सील कर दी जाएगी, और कोई कन्स्ट्रक्टर नहीं होगा।
इसके अतिरिक्त, भाषा नोटिस करेगी कि यह एक स्थिर वर्ग है और आपको विभिन्न स्थानों पर इसका उपयोग करने से रोकती है जो उदाहरणों को इंगित करती है, उदा। तर्क और चर टाइप करें। यह केवल निजी कन्स्ट्रक्टर होने की तुलना में इरादे को अधिक स्पष्ट रूप से इंगित करता है - जिसका अर्थ यह हो सकता है कि उस वर्ग के भीतर बनाए गए उदाहरण हैं (उदाहरण के लिए सिंगलटन कार्यान्वयन के लिए)।
ओह, और, बनाने वर्ग स्थिर कक्षा में किसी भी व्यर्थ उदाहरण के सदस्यों को शुरू करने से आप बंद हो जाएगा भी :)
स्थिर कक्षाओं के बारे में अधिक जानकारी के लिए MSDN देखें।
स्थैतिक वर्गों के बारे में उत्सुक बात, वे [कक्षाओं की तरह दिखते हैं] नहीं हैं (http://codecrafter.blogspot.ca/2009/09/c-static-classes-are-not-real-classes.html); वे मॉड्यूल के समान हैं ... –
तो सवाल यह है:
How can you make your class not be instanced without having your class be
static
orabstract
?
तो इसका जवाब है, जिसमें 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
के रूप में लागू करने की आवश्यकता होगी।
आम तौर पर, लोग आपकी बाधाओं को पाने के लिए प्रतिबिंब के ऐसे स्तरों से परेशान नहीं होते हैं, जब तक कि उन्हें 'वास्तव में' की आवश्यकता नहीं होती है, अस्पष्ट/चरम सीमा मामले इकाई परीक्षण लिखते हैं।
क्यों नहीं – Trikaldarshi
"तत्काल होने की अनुमति नहीं है" 'स्थिर वर्ग 'की सटीक परिभाषा है। आपको कुछ और क्यों चाहिए? –