2009-05-05 17 views
36

मैंने हाल ही में एक समस्या में भाग लिया जहां ऐसा लगता है कि मुझे 'स्थिर सार' विधि की आवश्यकता है। मुझे पता है कि यह असंभव क्यों है, लेकिन मैं इस सीमा के आसपास कैसे काम कर सकता हूं?सी #, विधियों जैसे 'स्थिर सार' लागू करें

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

abstract class AbstractBase 
{ 
    ... 
    public static abstract string Description{get;} 
    ... 
} 

यह नहीं होगा पाठ्यक्रम का संकलन। मैंने इंटरफेस का उपयोग करने के बारे में सोचा लेकिन इंटरफेस में स्थिर विधि हस्ताक्षर नहीं हो सकते हैं।

क्या मुझे इसे केवल गैर स्थैतिक बनाना चाहिए, और हमेशा उस वर्ग विशिष्ट जानकारी प्राप्त करने के लिए एक उदाहरण प्राप्त करें?

कोई विचार?

+0

इस प्रश्न के समान http://stackoverflow.com/questions/763344/c-virtual-or-abstract-static-methods/763364#763364 –

+0

संभावित डुप्लिकेट [क्यों मैं सी # में अमूर्त स्थिर तरीकों नहीं कर सकता ?] (https://stackoverflow.com/questions/3284/why-cant-i-have-abstract-static-methods-in-c) –

+0

संभावित डुप्लिकेट [वर्चुअल स्थिर गुणों को कैसे कार्यान्वित करें?] (https://stackoverflow.com/questions/15346631/how-to-implement-virtual-static-properties) – peterh

उत्तर

5

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

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

+0

मैंने फिर से स्थिति को सोचा, और मैं कहता हूं कि यह सच है ... सार्वजनिक सार स्ट्रिंग {get;} सार्वजनिक स्ट्रिंग की तरह लागू {{{वापसी {Izeeeeeeeeh ";}} पर्याप्त वर्ग विशिष्ट है। – Calmarius

+71

यह अर्थहीन नहीं है। कल्पना कीजिए कि आप एक ढांचा तैयार कर रहे हैं। आपको आवश्यकता है कि ISOMething को कार्यान्वित करने वाले वर्ग कुछ संकलित समय ज्ञात डेटा का पर्दाफाश करें। उदाहरण के लिए एक "दोस्ताना वर्ग नाम"। आप संकलक को यह सुनिश्चित करना चाहते हैं कि सभी ISomethings में यह संपत्ति हो। यदि आप अभी ऐसा करना चाहते हैं, तो आपको इंस्टेंस गुणों का उपयोग करना होगा। जिसका अर्थ केवल टाइपिंग के बजाय एक उदाहरण बनाना है। वह बेकार है। –

+3

मैं फ्रेमवर्क डिज़ाइन के लिए @RyanBarrett से सहमत हूं, यह उपभोक्ता को व्युत्पन्न वर्ग में फ़ंक्शन प्रदान करने के लिए मजबूर करने के लिए उपयोगी हो सकता है, लेकिन यह भी अनुबंध करता है कि फ़ंक्शन निष्पादित किया गया है, उदाहरण के बिना। –

31

आप नहीं कर सकते।

ऐसा करने के लिए स्थान विशेषताएँ के साथ है।

जैसे

[Name("FooClass")] 
class Foo 
{ 
} 
+0

चालाक। । । – Shog9

+3

दरअसल ... किसी के पास सार्वजनिक स्थैतिक विवरण संपत्ति हो सकती है, लेकिन इसे अधिक मूल्यवान बनाने के लिए विशेषता मान लेती है ... –

+0

यह जानने में रुचि होगी कि यह रनटाइम पर कैसे काम करता है। क्या विशेषता किसी प्रकार के उदाहरण के रूप में समाप्त होती है? मैंने प्रतिबिंब के माध्यम से पहले कस्टम विशेषताओं को पढ़ा है, लेकिन यह नहीं पता कि सीएलआर उन्हें –

3

यह अगर यह एक उदाहरण पर बुलाया जाना है स्थिर नहीं रहती।

यदि आप इसे किसी उदाहरण पर नहीं बुला रहे हैं, तो खेल में कोई बहुलकता नहीं है (यानी चाइल्डए। डिस्क्रिप्शन चाइल्डबी से पूरी तरह से असंबंधित है। जहां तक ​​भाषा का संबंध है)।

5

यदि यह स्थैतिक है, तो वैरिएबल का केवल एक उदाहरण है, मुझे नहीं पता कि विरासत कैसे समझेगी यदि हम कर सकते हैं जो आप व्युत्पन्न कक्षाओं में स्थिर वार्स के साथ पूरा करना चाहते हैं। व्यक्तिगत रूप से मुझे लगता है कि आप एक आवृत्ति var से बचने के लिए दूर तक जा रहे हैं।

क्यों क्लासिक तरीका नहीं है?

abstract class AbstractBase 
{ 
    protected string _Description = "I am boring abstract default value"; 
} 

class Foo : AbstractBase { 

    public Foo() { 
     _Description = "I am foo!"; 
    } 
} 
5

आप कार्यान्वयन के लिए टाल समझदारी से विवरण संपत्ति को लागू करने से परहेज नहीं करते, तो आप बस कर सकते हैं

public abstract string ClassDescription {get; } 
// ClassDescription is more intention-revealing than Description 

और लागू करने कक्षाएं कुछ इस तरह करना होगा:

static string classDescription="My Description for this class"; 
override string ClassDescription { get { return classDescription; } } 

फिर, आपके वर्गों को विवरण रखने के अनुबंध का पालन करना आवश्यक है, लेकिन आप इसे समझदारी से करने के लिए उन्हें छोड़ देते हैं। ऑब्जेक्ट उन्मुख फैशन में कार्यान्वयन को निर्दिष्ट करने का कोई तरीका नहीं है (क्रूर, नाजुक हैक्स के माध्यम से छोड़कर)।

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

0

आप "अमूर्त" आधार विधि को Exception फेंक सकते हैं, इसलिए एक डेवलपर को "चेतावनी दी जाती है" अगर वह बिना किसी ओवरराइड के बच्चे वर्ग पर इस विधि को आमंत्रित करने का प्रयास करता है।

नकारात्मकता यह है कि कोई कक्षा का विस्तार कर सकता है और इस विधि का उपयोग नहीं कर सकता है। फिर प्रदान किए गए अन्य उत्तरों का संदर्भ लें।

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