कार्यात्मक भाषाओं (जैसे लिस्प) में, आप यह निर्धारित करने के लिए पैटर्न मिलान का उपयोग करते हैं कि किसी सूची में किसी विशेष तत्व का क्या होता है। C # में समतुल्य एक श्रृंखला होगी यदि ... अन्य कथन जो किसी तत्व के प्रकार की जांच करते हैं और उसी के आधार पर एक ऑपरेशन करते हैं। कहने की जरूरत नहीं है, कार्यात्मक पैटर्न मिलान रनटाइम प्रकार की जाँच से अधिक कुशल है।
बहुरूपता का उपयोग पैटर्न मिलान के लिए एक करीबी मैच होगा। अर्थात्, किसी सूची की वस्तुएँ किसी विशेष इंटरफ़ेस से मेल खाती हैं और प्रत्येक ऑब्जेक्ट के लिए उस इंटरफ़ेस पर एक फ़ंक्शन को कॉल करती हैं। एक अन्य विकल्प यह होगा कि ओवरलोडेड तरीकों की एक श्रृंखला प्रदान की जाए जो एक विशिष्ट ऑब्जेक्ट प्रकार को एक पैरामीटर के रूप में लेते हैं। ऑब्जेक्ट को उसके पैरामीटर के रूप में लेने की डिफ़ॉल्ट विधि।
public class ListVisitor
{
public void DoSomething(IEnumerable<dynamic> list)
{
foreach(dynamic obj in list)
{
DoSomething(obj);
}
}
public void DoSomething(SomeClass obj)
{
//do something with SomeClass
}
public void DoSomething(AnotherClass obj)
{
//do something with AnotherClass
}
public void DoSomething(Object obj)
{
//do something with everything els
}
}
यह दृष्टिकोण लिस्प पैटर्न मिलान के लिए एक सन्निकटन प्रदान करता है। विज़िटर पैटर्न (जैसा कि यहां लागू किया गया है, विषम सूची के उपयोग का एक शानदार उदाहरण है)। एक अन्य उदाहरण संदेश प्रेषण के लिए होगा जहां, प्राथमिकता कतार में कुछ संदेशों के लिए श्रोता होते हैं और जिम्मेदारी की श्रृंखला का उपयोग करते हुए, डिस्पैचर संदेश को पास करता है और संदेश से मेल खाने वाला पहला हैंडलर इसे संभालता है।
फ्लिप पक्ष उन सभी को सूचित कर रहा है जो एक संदेश के लिए रजिस्टर करते हैं (उदाहरण के लिए इवेंट एग्रीगेटर पैटर्न जो आमतौर पर MVVM पैटर्न में ViewModels के ढीले युग्मन के लिए उपयोग किया जाता है)। मैं निम्नलिखित निर्माण का उपयोग करता हूं
IDictionary<Type, List<Object>>
शब्दकोश में जोड़ने का एकमात्र तरीका एक फ़ंक्शन है
Register<T>(Action<T> handler)
(और वस्तु वास्तव में हैंडलर में पारित होने के लिए एक कमजोर संदर्भ है)। इसलिए यहाँ मुझे सूची <ऑब्जेक्ट> का उपयोग करना है क्योंकि संकलन के समय, मुझे नहीं पता कि बंद प्रकार क्या होगा। हालांकि रनटाइम पर मैं यह लागू कर सकता हूं कि यह उस प्रकार का होगा जो शब्दकोश की कुंजी है। जब मैं घटना को आग लगाना चाहता हूं
Send<T>(T message)
और फिर से मैं सूची को हल करता हूं। सूची <डायनेमिक> का उपयोग करने का कोई फायदा नहीं है क्योंकि मुझे इसे वैसे भी डालने की आवश्यकता है। तो जैसा कि आप देख रहे हैं कि दोनों दृष्टिकोणों के गुण हैं। यदि आप विधिपूर्वक ओवरलोडिंग का उपयोग करके किसी वस्तु को डायनामिक रूप से भेजने जा रहे हैं, तो डायनेमिक इसे करने का तरीका है। यदि आप परवाह किए बिना जाने के लिए तैयार हैं, तो ऑब्जेक्ट का उपयोग भी कर सकते हैं।