2010-12-31 13 views
13

मैं एक दिलचस्प समस्या हुई है और कैसे सबसे अच्छा इस संभाल करने के लिए पर कुछ सुझाव के लिए देख रहा हूँ ...स्थिर सार स्ट्रिंग संपत्ति

मैं एक अमूर्त वर्ग कि एक स्थिर विधि है कि स्वीकार करता है शामिल है परिभाषित नहीं किया जा सकता एक स्थिर स्ट्रिंग जिसे मैं एक अमूर्त संपत्ति के रूप में परिभाषित करना चाहता हूं।

public abstract class ProviderConfiguration : ConfigurationSection 
    { 
     private const string _defaultProviderPropertyName = "defaultProvider"; 
     private const string _providersPropertyName = "providers"; 

     protected static string ConfigurationSectionName { get; } 

     public static Configuration Current 
     { 
      get { return Configuration)ConfigurationManager.GetSection(ConfigurationSectionName); } 
     } 
    } 

मैं एक तरह से संभाल करने के लिए इस ConfigurationSectionName नहीं सार बनाने के लिए किया जाएगा लगता है और: समस्या यह है कि सी # निम्नलिखित (देखें ConfigurationSectionName और वर्तमान गुण) का समर्थन नहीं करता नहीं करता है फिर व्युत्पन्न कक्षाओं में कॉन्फ़िगरेशनसेक्शननाम की एक नई परिभाषा बनाएं, लेकिन यह बहुत हैकिश महसूस करता है। किसी भी सुझाव का स्वागत किया जाएगा।

Gratias !!!

+3

यह संभव नहीं है। तुम क्या करने की कोशिश कर रहे हो? – SLaks

+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

उत्तर

9

स्टेटिक सदस्यों में बहुरूपता नहीं है, इसलिए वे सार नहीं हो सकते हैं। :(

हैं कि आपको क्या चाहिए,। कुछ भी नहीं है कि new एक बुरी बात बना देता है एक Singleton वस्तु बनाने, और उस वस्तु से दूर संपत्ति पढ़ने पर विचार करें।

+0

धन्यवाद। मैंने समीक्षा की कि मैं क्या अधिक विस्तार से पूरा करने की कोशिश कर रहा था (और कुछ नींद के बाद), यह स्पष्ट हो गया कि यह जवाब था। – goombaloon

3

बस new का प्रयोग कर एक व्युत्पन्न वर्ग में एक स्थिर विधि ओवरराइड करने के लिए है आभासी तरीकों और संपत्तियों के लिए क्या करने के लिए लागू होता है के बाद से प्रकार का नाम आपूर्ति होगी:।

public class BaseClass 
{ 
    public static int Max { get { return 0; } } 
} 

public class InteriorClass : BaseClass 
{ 
} 

public class DerivedClass : InteriorClass 
{ 
    public new static int Max { get { return BaseClass.Max + 1; } } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine("BaseClass.Max = {0}", BaseClass.Max); 
     Console.WriteLine("InteriorClass.Max = {0}", InteriorClass.Max); 
     Console.WriteLine("DerivedClass.Max = {0}", DerivedClass.Max); 
     Console.ReadKey(); 
    } 
} 
+3

यह गोम्बालून के उदाहरण के साथ काम नहीं करेगा। उनकी बेस क्लास व्युत्पन्न कक्षा को आवश्यक मूल्य वापस करने की अपेक्षा करेगी, लेकिन क्योंकि व्युत्पन्न वर्ग संपत्ति दिखाएगा, बेस क्लास के पास केवल अपने मूल कार्यान्वयन की पहुंच होगी। – rossisdead

+1

स्थिर संपत्ति जो व्युत्पन्न कार्यान्वयन के आधार पर व्यवहार को लागू करती है, उसे "सार्वजनिक" नया कॉन्फ़िगरेशन वर्तमान "इस मामले में" नया "के साथ पुन: कार्यान्वित करने की आवश्यकता है। यह संगठन के अलावा किसी वास्तविक उपयोग के आधार अनुभाग का नाम बनाता है। –

0

के रूप में दूसरों का उल्लेख किया है तुम क्या करने की कोशिश कर रहे हैं, असंभव है

मैं someth कोशिश करता हूँ व्यवहार में इस

public abstract class ProviderConfiguration : ConfigurationSection 
{ 
    public string ConfigurationSectionName { get; set; } 

    public static ProviderConfiguration Provider { get; set; } 

    public static Configuration Current 
    { 
     get { return (Configuration)ConfigurationManager.GetSection(Provider.ConfigurationSectionName); } 
    } 
} 

तरह ing तब:

public void DoStuff() 
{ 
    var provider = new DerivedProviderConfiguration(); 
    ProviderConfiguration.Provider = provider; 
} 
1

ठीक है, यह वास्तव में एक स्थिर सार संपत्ति बनाने के लिए नहीं है, लेकिन आप इच्छित प्रभाव को प्राप्त कर सकते हैं।

आप जेनरिक का उपयोग करके इस प्राप्त कर सकते हैं:

public abstract class MyAbstractClass<T> 
{ 
    public static string MyAbstractString{ get; set; } 
    public static string GetMyAbstracString() 
    { 

     return "Who are you? " + MyAbstractString; 

    } 
} 

public class MyDerivedClass : MyAbstractClass<MyDerivedClass> 
{ 
    public static new string MyAbstractString 
    { 
     get 
     { 
      return MyAbstractClass<MyDerivedClass>.MyAbstractString; 
     } 
     set 
     { 
      MyAbstractClass<MyDerivedClass>.MyAbstractString = value;    
     } 
    } 

} 


public class MyDerivedClassTwo : MyAbstractClass<MyDerivedClassTwo> 
{ 
    public static new string MyAbstractString 
    { 
     get 
     { 
      return MyAbstractClass<MyDerivedClassTwo>.MyAbstractString; 
     } 
     set 
     { 
      MyAbstractClass<MyDerivedClassTwo>.MyAbstractString = value; 
     } 
    } 

} 


public class Test 
{ 

    public void Test() 
    { 

     MyDerivedClass.MyAbstractString = "I am MyDerivedClass"; 
     MyDerivedClassTwo.MyAbstractString = "I am MyDerivedClassTwo"; 


     Debug.Print(MyDerivedClass.GetMyAbstracString()); 
     Debug.Print(MyDerivedClassTwo.GetMyAbstracString()); 


    } 

} 

तो, परीक्षण वर्ग बुला आप मिल जाएगा:

"कौन आपको मैं कर रहा हूँ रहे हैं MyDerivedClass" "कौन आपको मैं कर रहा हूँ कर रहे हैं MyDerivedClassTwo "

तो, आप एक स्थिर विधि एक सार कक्षा में है, लेकिन सार मूल्य प्रत्येक व्युत्पन्न वर्ग के लिए अलग अलग, अच्छा है: डी

ठीक है, तो, यहाँ क्या हो रहा है? यह चाल जेनेरिक टैग है, संकलक प्रत्येक व्युत्पन्न प्रकार के लिए एक अलग सार वर्ग उत्पन्न करता है।

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

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