2009-07-10 21 views
5

द्वारा उपयोग किए गए सदस्य परिवर्तनीय ओवरराइड ठीक है, इसलिए मैं शीर्ष पर सही मानता हूं कि यह थोड़ा सा खराब है ... लेकिन यह एक तार्किक उद्देश्य प्रदान करता है। मैं एक वर्तमान प्रोजेक्ट के लिए सी # का उपयोग कर रहा हूं और मैं एक व्युत्पन्न वर्ग में एक सदस्य चर को ओवरराइड करने का एक तरीका खोजने का प्रयास कर रहा हूं, लेकिन बेस क्लास विधि में ओवरराइड वैरिएबल तक पहुंचता हूं। चीजों को और अधिक "मनोरंजक" बनाने के लिए यह बेहतर होगा अगर ओवरराइड सदस्य चर स्थिर था (यह नीचे दिए गए उदाहरण कोड में नहीं दिखाया गया है)।सी # बेस क्लास विधि

class baseclass 
{ 
    protected string[] array = null; 

    public string method() 
    { 
     string str = ""; 
     foreach (string x in this.array) 
     { 
      str += x + " "; 
     } 

     return str; 
    } 
} 

class subclass1 : baseclass 
{ 
    new string[] array = new string[] 
    { 
     "class1value1", 
     "class1value2", 
     "class1value3", 
     "class1value4" 
    }; 
} 

class subclass2 : baseclass 
{ 
    new string[] array = new string[] 
    { 
     "class2value1", 
     "class2value2", 
     "class2value3", 
     "class2value4" 
    }; 
} 

क्यों यह काम नहीं करता है के रूप में किसी भी विचार और इसके चारों ओर पाने के लिए एक तरह से:

यहाँ मेरी नमूना कोड है?

+1

सदस्य चर तरीकों की तरह बहुरूपी नहीं हैं प्राप्त करने के लिए आधार वर्ग संपत्ति

ओवरराइड करता है। प्रत्येक उपclass में वांछित मान रखने के लिए सरणी शुरू करें। –

उत्तर

8

क्या कोई कारण है कि आप वर्चुअल प्रॉपर्टी का उपयोग नहीं कर सकते हैं? यह वही कार्यक्षमता प्रदान करेगा जो आप खोज रहे हैं। यह सिर्फ एक क्षेत्र नहीं होगा।

protected abstract string[] array { get; } 

...

protected override string[] array { get { return new string[]{"...","..."}; }} 
+0

मैं अभी इस के साथ खेल रहा हूं ... आप सही हैं यह काम कर सकता है ... अभी भी सुनिश्चित करने के लिए खेल रहा है। मेरे विचार में अधिक आत्मविश्वास जोड़ने के लिए धन्यवाद। –

1

आपको चर को ओवरराइड करने की आवश्यकता क्यों है? अपने कोड से देख रहे हैं, बस मान निर्धारित करना पर्याप्त होगा, नहीं?

प्लस, स्थैतिक चर वर्ग (उदाहरण नहीं) से बंधे हैं, इसलिए यह किसी भी स्थिति पर अतिसंवेदनशील नहीं है।

+0

आप अलग-अलग डेटा रखने के लिए अलग वर्ग बना रहे हैं, +1 –

1

बस नये प्रयोग नहीं करते। अपने उपclass 'कन्स्ट्रक्टर में सरणी सेट करें।

संपादित करें: कोड के साथ:

class subclass1 : baseclass 
{ 
    public subclass1() 
    { 
     array = new string[] 
     { 
      "class1value1", 
      "class1value2", 
      "class1value3", 
      "class1value4" 
     }; 
    } 
} 

class subclass2 : baseclass 
{ 
    public subclass2() 
    { 
     array = new string[] 
     { 
      "class2value1", 
      "class2value2", 
      "class2value3", 
      "class2value4" 
     }; 
    } 
} 
+0

यह मुझे एक स्थिर सरणी रखने की अनुमति नहीं देगा –

1
class BaseClass 
{ 
    public virtual string Method() 
    { 
     return string.Empty; 
    } 
} 

abstract class BaseClass<T> : BaseClass where T : BaseClass<T> 
{ 
    protected static string[] strings; 

    public override string Method() 
    { 
     return string.Join(" ", strings); 
    } 
} 

class Subclass1 : BaseClass<Subclass1> 
{ 
    static Subclass1() 
    { 
     strings = new[] { "class1value1", "class1value2", "class1value3" }; 
    } 
} 

class Subclass2 : BaseClass<Subclass2> 
{ 
    static Subclass2() 
    { 
     strings = new[] { "class2value1", "class2value2", "class2value3" }; 
    } 
} 

महत्वपूर्ण हिस्सा सामान्य पैरामीटर T है जो मूल रूप से काम करता है स्ट्रिंग सरणियों के लिए एक सूचकांक के रूप में।

1

आप सरणी से बहुलक व्यवहार प्राप्त करने की कोशिश कर रहे हैं लेकिन आप कक्षा स्थानीय व्यवहार के लिए इसे परिभाषित कर रहे हैं।

सरणी आभासी या विधि() आधार वर्ग में हमेशा से आधार वर्ग में सरणी का उपयोग करने की संकलित कर देगा हो गया है - सरणी भी एक संपत्ति नहीं एक क्षेत्र ऐसा करने के लिए, यानी होना चाहिए

स्ट्रिंग [] _array = {...};/बेस क्लास स्थानीय मान संरक्षित वर्चुअल स्ट्रिंग [] सरणी {get {return _array; }} // सरणी संपत्ति overridable बनाता

तो उपवर्गों में, तुम क्या करने की आवश्यकता होगी

स्ट्रिंग [] _array = {...}; // subclass स्थानीय मान आभासी स्ट्रिंग [] सरणी {get {return _array; }} // इस आदेश वांछित को प्रभावित

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