2011-05-01 11 views
34

abstract बेस क्लास में यदि हमारे पास static फ़ील्ड्स हैं तो उनके साथ क्या होता है?बेस क्लास और व्युत्पन्न कक्षाओं में स्टेटिक फ़ील्ड्स

क्या उनके दायरे कक्षाएं हैं जो इस बेस क्लास से प्राप्त होती हैं या जिस प्रकार से वह विरासत में है (प्रत्येक उपclass की फ़ील्ड की abstract बेस क्लास से इसकी अपनी प्रति है)?

+0

Btw, तथ्य यह है कि आधार वर्ग 'है abstract' एक रेड हेरिंग है; इससे कोई फर्क नहीं पड़ता कि बेस क्लास 'अमूर्त' है या नहीं, व्यवहार @Marc Gravell इंगित करता है। – casperOne

+0

@casperOne: मैं 'TypeLocal 'जैसे कुछ ढूंढ रहा था क्योंकि हमारे पास' थ्रेडलोकल 'है, इसलिए उस प्रकार की कोई भी वस्तु इसके संबंधित' सबक्लास 'में' स्थिर' होगी। – Xaqron

उत्तर

54

static सदस्यों पूरी तरह वर्ग घोषित करने के लिए विशिष्ट हैं; subclasses अलग प्रतियां नहीं मिलता है। यहां एकमात्र अपवाद जेनेरिक है; यदि एक खुला जेनेरिक प्रकार स्थैतिक फ़ील्ड घोषित करता है, तो फ़ील्ड उस सटीक संयोजन प्रकार के तर्क सामान्य जेनेरिक प्रकार के लिए विशिष्ट है; i.e. Foo<int> में अलग-अलग स्थिर फ़ील्ड Foo<string> होंगे, मानते हैं कि फ़ील्ड Foo<T> पर परिभाषित हैं।

+0

@Marc Gravell: क्षमा करें आदमी, आप और @ जोन स्कीट ने मुझे पैडेंटिक होने के लिए सिखाया; आप "स्थैतिक तर्क" के विपरीत "तर्क टाइप करें" कहने के लिए थे। =) आशा है कि सभी तालाब में अच्छी तरह से हैं। – casperOne

+2

'बेस क्लास 'से सभी उदाहरणों (प्रति प्रकार) के लिए एक अद्वितीय चर घोषित करने का तरीका कैसे है? – Xaqron

+0

@Xaqron: आप नहीं कर सकते हैं, आपको प्रत्येक व्युत्पन्न वर्ग पर इच्छित स्थिर सदस्य को फिर से शुरू करना होगा। – casperOne

8

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

class Base 
{ 
    private static Dictionary<string, int> myStaticFieldDict = new Dictionary<string, int>(); 

    public int MyStaticField 
    { 
     get 
     { 
      return myStaticFieldDict.ContainsKey(this.GetType().Name) 
        ? myStaticFieldDict[this.GetType().Name] 
        : default(int); 
     } 

     set 
     { 
      myStaticFieldDict[this.GetType().Name] = value; 
     } 
    } 

    void MyMethod() 
    { 
     MyStaticField = 42; 
    } 
} 
संबंधित मुद्दे