2008-11-10 11 views
7

मेरे पास एक सार्वजनिक स्थैतिक वर्ग है जिसमें मैं ToString() विधि रखना चाहता हूं।आप स्थैतिक वर्ग में ToString को ओवरराइड कैसे करते हैं?

मैं सार्वजनिक स्थैतिक स्ट्रिंग toString() के रूप में परिभाषित किया है, लेकिन निम्न चेतावनी मिलती है:

'Class.ToString()' विरासत में मिला खाल सदस्य 'object.ToString()'। वर्तमान सदस्य को उस कार्यान्वयन को ओवरराइड करने के लिए, ओवरराइड कीवर्ड जोड़ें। अन्यथा नया कीवर्ड जोड़ें।

मैं ओवरराइड कीवर्ड जोड़ते हैं मैं इस त्रुटि के बजाय मिल:

एक स्थिर सदस्य 'Class.ToString()' के रूप में ओवरराइड, आभासी, या सार चिह्नित नहीं किया जा सकता

मैं उस चेतावनी से कैसे छुटकारा पा सकता हूं और मेरी स्थैतिक कक्षा को ToString() विधि देता हूं।

, धन्यवाद,
कीथ

+0

क्या मैं पूछ सकता हूं कि आप ऐसा क्यों करना चाहते हैं? (बस जिज्ञासु) – StingyJack

+0

मेरे पास एक त्रुटि है जो एक स्थिर वर्ग है, मेरे कोड के माध्यम से मैं ErrorLogItem को त्रुटि लॉग में जोड़ सकता हूं। ErrorLog सभी ErrorLogItems को सहेजकर डेटाबेस में स्वयं को सहेज सकता है। यदि डेटाबेस पहुंच योग्य नहीं है (बड़ी त्रुटि), तो मैं पूरे लॉग को एक स्ट्रिंग में परिवर्तित कर सकता हूं और इसे डिस्क पर सहेज सकता हूं। –

+0

इस चर्चा के बारे में दो बातें। सबसे पहले, आपको यह उल्लेख करना चाहिए था कि आपका मतलब .NET था हालांकि यह वर्तनी और बाद की चर्चा से स्पष्ट हो गया था। – orcmid

उत्तर

12

हां, "नया" संशोधक का उपयोग करके प्रभावी ढंग से संकलक चेतावनी को चुप कर दिया जाएगा, लेकिन आप स्पष्ट रूप से को एक स्थिर विधि के साथ एक उदाहरण विधि छुपा रहे हैं। (यह विधि को ओवरराइड करने से अलग है।) आमतौर पर आप बहुत अच्छे कारणों को छोड़कर एक इंस्टेंस विधि छिपाना नहीं चाहते हैं और आपको वास्तव में इसे एक स्थिर विधि से छिपाना नहीं चाहिए क्योंकि वास्तव में कॉल के व्यवहार अर्थशास्त्र को बदलता है। .NET में प्रत्येक ऑब्जेक्ट में ToString() नामक एक इंस्टेंस विधि होती है जिसमें विशिष्ट व्यवहार होता है जो डेवलपर अपेक्षा करते हैं; एक नई स्थैतिक विधि के साथ उस व्यवहार को छुपाकर आप उस उम्मीद को बदल रहे हैं जो बहुत भ्रम पैदा कर सकता है।

आप "स्ट्रिंग करने के लिए" क्या हैं? स्टेटिक क्लास आमतौर पर आंतरिक स्थिति नहीं रखते हैं इसलिए वास्तव में कोई ToString() कॉल के लॉजिकल आउटपुट के रूप में प्रदान करने के लिए कोई आंतरिक डेटा नहीं होना चाहिए। आप अपने क्लास डिज़ाइन पर पुनर्विचार करना चाहते हैं या एक अलग विधि नाम प्रदान करना चाहते हैं जो उदाहरण ToString() को छुपाए बिना विधि के उद्देश्य को स्पष्ट रूप से इंगित करता है।

+0

एक ही समस्या में ठोकरें: एक वर्ग में जो तार्किक स्थितियों को मानचित्रित करता है: और, या नहीं, और भी, मैं भी सत्य और गलत पर नक्शा करता हूं, जो स्थिर रूप से कार्यान्वित किया जाता है। जटिल हालत के पेड़ों को आउटपुट करने के लिए, मैं चाहता हूं कि ToString() "x और y", और इसी तरह, मैं ToString() "true" को सच करना चाहता हूं। सच स्थिर है - केवल एक ही हो सकता है। ;) विकल्पों के बारे में सुनने के लिए खुशी हुई! –

3

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

इसके अलावा आप ओवरराइड क्यों करना चाहते हैं। ToString()? कक्षा का उदाहरण प्राप्त करने का कोई तरीका नहीं है और इसलिए फ़ंक्शन को कॉल करने का कोई तरीका नहीं है।

नोट: नए वाक्यविन्यास का उपयोग ओवरराइड नहीं होगा। ToString। यह एक नया सदस्य बनाएगा जो ऑब्जेक्ट.ToString() विधि से पूरी तरह से असंबंधित है।

+0

कड़ाई से बोलते हुए, वह ऑब्जेक्ट ओवरराइड नहीं कर रहा है। टॉस्ट्रिंग, वह इसे छुपा रहा है। मैं क्यों नहीं बोल सकता ... –

+0

सही। हालांकि उनके पद का शीर्षक "ओवरराइड" कहता है, इसलिए मैं स्पष्ट करना चाहता था कि वास्तव में मेरे उत्तर की तुलना में क्या मतलब था। – JaredPar

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