जब भी मैं प्रश्न पढ़ता हूं, या स्थिर विरासत का एक समान विषय, आमतौर पर जवाब यह समर्थित नहीं है (हम जानते हैं), और कारण के रूप में दिया जाता है क्योंकि यह एक खराब डिजाइन है और इसे करने का शायद एक बेहतर तरीका है। मुझे ऐसा करने का बेहतर तरीका मिलना अच्छा लगेगा, इसलिए सभी सुझावों के लिए खुला हूं - यहां मैं जो करने की कोशिश कर रहा हूं।सी # आभासी स्थैतिक तरीकों और स्थैतिक उप वर्गों के लिए वैकल्पिक
मेरे पास एक कक्षा है जिसमें कोई उदाहरण डेटा नहीं है। सभी विधियां स्थिर हैं। आइए इसे class BaseStatic
पर कॉल करें। अब मैं एक नया स्थैतिक वर्ग चाहता हूं (अच्छी तरह से कई निश्चित रूप से एक से चिपकने वाला) जो इस स्थैतिक वर्ग से विरासत में आता है और कुछ नए स्थिर तरीकों को जोड़ता है, चलो इसे SubStatic
पर कॉल करें।
क्या मैं उपभोक्ताओं के लिए लिखने में सक्षम हो चाहते हैं:
SubStatic.MethodFromSub();
और भी
SubStatic.MethodFromBase();
मैं मैं भी लिख सकता है पता है:
BaseStatic.MethodFromBase()
स्पष्ट रूप से लेकिन फिर उपभोक्ताओं है यह जानने के लिए कि कौन सी कक्षाएं लागू करती हैं। मैं विरासत के साथ ऐसा नहीं कर सकता क्योंकि मैं एक स्थिर वर्ग को दूसरे से प्राप्त नहीं कर सकता। तो ऐसा करने का एक बेहतर तरीका क्या है?
अब, मैं जानता हूँ कि मैं उदाहरण के वर्ग के रूप में इन कक्षाओं में हो सकता है, और मैं स्थिर के रूप में सभी तरीकों को परिभाषित कर सकते हैं - कि मुझे व्यवहार मैं ऊपर वर्णित देना लेकिन, अन्य समस्याओं की ओर जाता है अर्थात् होगा:
जब मैं यह कर:
SubStatic.MethodFromBase()
SubStatic
स्थिर निर्माता कहा जाता है नहीं है, क्योंकि विधि (माता-पिता के स्थिर निर्माता कहा जाता है)स्थिर माता पिता तरीकों में से एक एक और विधि कॉल करने की जरूरत है माता पिता स्थिर कक्षा में चल रहा है जो उप वर्ग ओवरराइड कर सकते हैं, मुझे एक वर्चुअल स्थिर की आवश्यकता है उप वर्ग में विधि। जो मुझे पता है मैं नहीं कर सकता।
तो खराब डिजाइन स्पष्ट रूप से - क्या कोई मुझे इसे फिर से करने में मदद कर सकता है? मुझे पता है कि मैं इंस्टेंस विरासत का उपयोग कर सकता हूं और आभासी तरीकों का उचित उपयोग कर सकता हूं (मैंने इसे इस तरह से काम किया है) लेकिन क्लाइंट कोड को हमेशा एक उदाहरण बनाना होता है (या मुझे लगता है कि कुछ सिंगलटन)।
आप सिंगलटन डिज़ाइन पैटर्न का उपयोग कर सकते हैं जिसमें आप उदाहरण बनाते हैं और उन्हें उपयोगकर्ता को वापस कर देते हैं। क्या इससे आपकी समस्या को हल करने में मदद नहीं मिलेगी? – manman
हां - लेकिन फिर भी मैं एक उदाहरण बना रहा हूं, है ना? इसके अलावा, उपभोक्ताओं को लिखना होगा: SomeClass.Instance.SomeMethod(), है ना? – RBrowning99
हां, आपको उदाहरण बनाना है, लेकिन केवल एक बार और फिर आप आलसी लोडिंग पैटर्न का उपयोग करके उन्हें कैश कर सकते हैं। यह एकमात्र तरीका है जिससे आप विरासत प्राप्त कर सकते हैं। इसके अलावा, इससे अधिक लचीला कोड होगा। – manman