2013-05-24 6 views
7

instantiating मैं कुछ आभासी कार्यों के साथ एक वर्ग है, के लिए बहाना यह उनमें से एक है करते हैं:अधिभावी आभासी तरीकों जब एक वर्ग

public class AClassWhatever 
{ 
    protected virtual string DoAThingToAString(string inputString) 
    { 
     return inputString + "blah"; 
    } 
} 

मैं इस वर्ग का दृष्टांत करना चाहते हैं, जबकि अधिभावी इनलाइन "DoAThingToAString", ज्यादा मैं की तरह एक घोषणा में इनलाइन गुण घोषणा कर सकते हैं इस प्रकार है:

... 

AClassWhatever instance = new AClassWhatever 
{ 
    DoAThingToAString = new function(string inputString) 
    { 
     return inputString + inputString + " fill my eyes." 
    } 
} 

... 

और अब "उदाहरण के लिए", DoAThingToAString कि परिभाषा के साथ अधिरोहित है। मुझे कक्षा परिभाषा में डिफ़ॉल्ट व्यवहार को परिभाषित करने में सक्षम होना चाहिए और इसे केवल अलग-अलग अलग-अलग समय के रूप में ओवरराइड करना होगा, और मैं ऐसा करने के लिए उप-वर्गों के समूह को बढ़ाना नहीं चाहता हूं।

मुझे पता है कि मुझे प्रतिनिधियों या कुछ समान उपयोग करने की आवश्यकता है, लेकिन मैं बहुत लंबे समय तक वाक्यविन्यास गेम से बाहर हूं और Google मुझे बहुत अधिक अप्रासंगिक जानकारी दे रहा है।

उत्तर

6

आप ऐसा करने के लिए प्रतिनिधियों या Func एस का उपयोग कर सकते हैं।

पहले, अपने AClassWhatever वर्ग से जोड़ें:

public Func<string, string> DoAThingToAString = (x) => x + "blah"; 

अब आप कार्रवाई ओवरराइड करने के लिए एक ही वाक्य विन्यास का उपयोग कर सकते हैं।

AClassWhatever instance = new AClassWhatever() 
{ 
    DoAThingToAString = (x) => x + x + " fill my eyes." 
}; 
+0

इस वाक्य रचना मैं था खोज रहे हैं, लेकिन बेवकूफ सवाल। DoAThingToAString में, मैं एक नियंत्रक विस्तार विधि का उपयोग कर रहा हूं जिसे नियंत्रक क्रिया से कहा जाता है: 'यह .DEExtensionMethod (someString);' अब मेरे पास अब "इस" का संदर्भ नहीं है कि मैं Func के अंदर हूं परिभाषा। क्या कॉलर का संदर्भ पाने का कोई तरीका है, या क्या मुझे इसे अपने अन्य इनपुट के साथ पास करना होगा? – kamii

+2

@ कमी, आपको ऑब्जेक्ट, या किसी अन्य विशिष्ट मूल्यों के संदर्भ में आपको पास करना होगा। यह एक अनाम कार्य है, इसलिए इसे उदाहरण का कोई अंदाजा नहीं है। (कृपया मुझे जांचें)। – gunr2171

5

आप तरीकों के साथ यह नहीं कर सकते, लेकिन आप प्रतिनिधियों/गुमनाम तरीकों के साथ बराबर कर सकता है:

public class AClassWhatever 
{ 
    public AClassWhatever() 
    { 
     this.DoAThingToAString = this.DoAThingToAStringImpl; 
    } 

    public Func<string, string> DoAThingToAString { get; set; } 

    protected virtual string DoAThingToAStringImpl(string input) 
    { 
     return input + input + " fill my eyes."; 
    } 
} 

उपयोग:

var instance = new AClassWhatever 
{ 
    DoAThingToAString = inputString => inputString + inputString + 
     " fill my eyes something other than the default behavior." 
} 

var result = instance.DoAThingToAString("input"); 

ध्यान दें कि inputString => inputString + inputString + "..." ही है x => x + x + "..."

+0

"मुझे कक्षा परिभाषा में डिफ़ॉल्ट व्यवहार को परिभाषित करने में सक्षम होना चाहिए ..." – mellamokb

+0

@mellamokb मैंने कन्स्ट्रक्टर में एक डिफ़ॉल्ट कार्यान्वयन प्रदान करने के लिए अपना जवाब बदल दिया। – Dan

+0

मैं आपको बेहतर कोडिंग के कारण उत्तर दे रहा हूं, लेकिन शायद आपके पास संदर्भ-से-कॉलर प्रश्न का उत्तर है, मैंने टिप्पणियों में gunr2171 से पूछा था?इस सूचक का उपयोग करने के बजाय – kamii

0

एक प्रतिनिधि संपत्ति को परिभाषित क्यों नहीं करें और उस परिभाषा का उपयोग करें यदि विधि कहलाती है तो यह मौजूद है? ऑब्जेक्ट के आपके तत्कालता में, आप संपत्ति का उपयोग करके वैकल्पिक परिभाषा प्रदान कर सकते हैं।

उदाहरण के लिए:

public MyDelegateTypeThatMatchesMyFunctionCall DoAThingToAStringProperty { get; set; } 

public class AClassWhatever 
{ 
    protected virtual string DoAThingToAString(string inputString) 
    { 
     var handler = this.DoAThingToAStringProperty; 
     if (handler) 
     { 
      return handler(inputString); 
     } 

     // do default behavior 
     return inputString + "blah"; 
    } 
} 

आप सुनिश्चित करें कि आपके प्रतिनिधि संपत्ति आभासी विधि के किसी भी ओवरराइड परिभाषा को ओवरराइड करता है चाहते हैं तो आप इसे इस तरह कर सकता है:

public MyDelegateTypeThatMatchesMyFunctionCall DoAThingToAStringProperty { get; set; } 

public class AClassWhatever 
{ 
    protected string DoAThingToAString(string inputString) 
    { 
     var handler = this.DoAThingToAStringProperty; 
     if (handler) 
     { 
      return handler(inputString); 
     } 

     // do default behavior 
     return DoAThingToAStringInternal(inputString); 
    } 

    protected virtual string DoAThingToAStringInternal(string inputString) 
    { 
     // do default behavior 
     return inputString + "blah"; 
    } 
} 
संबंधित मुद्दे