मुझे एक क्लास पद्धति के रूप में एक ही हस्ताक्षर के साथ एक विस्तार विधि को लागू करने का एक तरीका मिल गया है, हालांकि यह बहुत सुरुचिपूर्ण नहीं लगता है। विस्तार के तरीकों के साथ खेलने के दौरान मैंने कुछ अनिर्दिष्ट व्यवहार पर ध्यान दिया। नमूना कोड:
public static class TestableExtensions
{
public static string GetDesc(this ITestable ele)
{
return "Extension GetDesc";
}
public static void ValDesc(this ITestable ele, string choice)
{
if (choice == "ext def")
{
Console.WriteLine($"Base.Ext.Ext.GetDesc: {ele.GetDesc()}");
}
else if (choice == "ext base" && ele is BaseTest b)
{
Console.WriteLine($"Base.Ext.Base.GetDesc: {b.BaseFunc()}");
}
}
public static string ExtFunc(this ITestable ele)
{
return ele.GetDesc();
}
public static void ExtAction(this ITestable ele, string choice)
{
ele.ValDesc(choice);
}
}
public interface ITestable
{
}
public class BaseTest : ITestable
{
public string GetDesc()
{
return "Base GetDesc";
}
public void ValDesc(string choice)
{
if (choice == "")
{
Console.WriteLine($"Base.GetDesc: {GetDesc()}");
}
else if (choice == "ext")
{
Console.WriteLine($"Base.Ext.GetDesc: {this.ExtFunc()}");
}
else
{
this.ExtAction(choice);
}
}
public string BaseFunc()
{
return GetDesc();
}
}
मैंने जो देखा वह यह था कि अगर मैंने एक एक्सटेंशन विधि के अंदर से दूसरी विधि को कॉल किया, तो यह विस्तार विधि को कॉल करेगा जो हस्ताक्षर से मेल खाता था, भले ही एक वर्ग विधि थी जो हस्ताक्षर से मेल खाती थी। उदाहरण के लिए ऊपर दिए गए कोड में, जब मैं ExtFunc () को कॉल करता हूं, जो बदले में ele.GetDesc () कहता है, तो मुझे स्ट्रिंग "बेस गेटडेस्क" के बजाय रिटर्न स्ट्रिंग "एक्सटेंशन गेटडेस्क" मिलता है जिसकी हम उम्मीद करेंगे।
कोड का परीक्षण:
var bt = new BaseTest();
bt.ValDesc("");
//Output is Base.GetDesc: Base GetDesc
bt.ValDesc("ext");
//Output is Base.Ext.GetDesc: Extension GetDesc
bt.ValDesc("ext def");
//Output is Base.Ext.Ext.GetDesc: Extension GetDesc
bt.ValDesc("ext base");
//Output is Base.Ext.Base.GetDesc: Base GetDesc
यह आपको वसीयत में वर्ग विधियों और विस्तार विधियों के बीच आगे-पीछे उछालने की अनुमति देता है, लेकिन आपको "इच्छा" के दायरे में लाने के लिए डुप्लिकेट "पास-थ्रू" तरीकों को जोड़ने की आवश्यकता होती है। मैं इसे बेहतर शब्द की कमी के लिए यहाँ गुंजाइश कह रहा हूँ। उम्मीद है कि कोई मुझे बता सकता है कि इसे वास्तव में क्या कहा जाता है।
आपने मेरे "पास-थ्रू" विधि नामों से अनुमान लगाया होगा कि मैंने प्रतिनिधियों को इस उम्मीद में पास करने के विचार के साथ खिलवाड़ किया कि एक एकल विधि या दो एक ही हस्ताक्षर के साथ कई विधियों के लिए पास-थ्रू के रूप में कार्य कर सकती है। दुर्भाग्य से यह तब नहीं हुआ जब एक बार प्रतिनिधि को अनपैक कर दिया गया था, इसने हमेशा क्लास विधि को विस्तार पद्धति पर चुना, यहां तक कि एक और विस्तार विधि के अंदर से भी। "स्कोप" अब मायने नहीं रखता। मैंने एक्शन और फंक प्रतिनिधियों का बहुत अधिक उपयोग नहीं किया है, हालांकि शायद कोई और अधिक अनुभवी व्यक्ति उस हिस्से का पता लगा सकता है।