2012-06-13 16 views
10

MSDN doc से:प्रतिनिधि पैटर्न बनाम प्रतिनिधि कीवर्ड सी # में

एक प्रतिनिधि एक प्रकार है कि सुरक्षित रूप से एक विधि, सी और सी में एक समारोह सूचक ++ के समान समाहित है। सी फ़ंक्शन पॉइंटर्स के विपरीत, प्रतिनिधि ऑब्जेक्ट-ओरिएंटेड हैं, सुरक्षित टाइप करें और सुरक्षित हैं।

मुझे पता है कि यह क्या है और इसका उपयोग कैसे करें। लेकिन मुझे आश्चर्य है कि यह प्रतिनिधि पैटर्न पर लिखा गया है या नहीं, मुझे पता है (wikipedia से)।
उनके बीच क्या अंतर है?

उत्तर

5

सी # (न पैटर्न) प्रतिनिधि उपयोगी हो सकता है जब आप delegate pattern कार्यान्वित कर रहे हैं बस अपने परिवर्तन के साथ विकिपीडिया से इस प्रतिनिधि पैटर्न कार्यान्वयन को देखो:

//NOTE: this is just a sample, not a suggestion to do it in such way 

public interface I 
{ 
    void F(); 
    void G(); 
} 

public static class A 
{ 
    public static void F() { System.Console.WriteLine("A: doing F()"); } 
    public static void G() { System.Console.WriteLine("A: doing G()"); } 
} 

public static class B 
{ 
    public static void F() { System.Console.WriteLine("B: doing F()"); } 
    public static void G() { System.Console.WriteLine("B: doing G()"); } 
} 

public class C : I 
{ 
    // delegation 
    Action iF = A.F; 
    Action iG = A.G; 

    public void F() { iF(); } 
    public void G() { iG(); } 

    // normal attributes 
    public void ToA() { iF = A.F; iG = A.G; } 
    public void ToB() { iF = B.F; iG = B.G; } 
} 

public class Program 
{ 
    public static void Main() 
    { 
     C c = new C(); 
     c.F();  // output: A: doing F() 
     c.G();  // output: A: doing G() 
     c.ToB(); 
     c.F();  // output: B: doing F() 
     c.G();  // output: B: doing G() 
    } 
} 

फिर प्रतिनिधि यहाँ उपयोगी हो सकता है, लेकिन यह पेश नहीं किया गया था। आपको इसे निम्न स्तर के निर्माण के बजाय पैटर्न के रूप में देखना चाहिए। बस this article को देखो, कभी यह भी visitor pattern लागू करने के लिए आप मदद कर सकता है - - events साथ जोड़ी में यह publisher/subscriber(observer) pattern को लागू करने के लिए इस्तेमाल किया जा सकता है इस सक्रिय रूप से LINQ में प्रयोग किया जाता है:

public void Linq1() 
{ 
    int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; 

    // n => n < 5 is lambda function, creates a delegate here 
    var lowNums = numbers.Where(n => n < 5); 

    Console.WriteLine("Numbers < 5:"); 
    foreach (var x in lowNums) 
    { 
     Console.WriteLine(x); 
    } 
} 

संक्षेप में: एक भाषा प्रतिनिधि स्वयं पैटर्न नहीं है, यह आपको first class objects के रूप में कार्य करने की अनुमति देता है।

+0

बहुत बहुत धन्यवाद, बहुत स्पष्ट – R4j

0

प्रतिनिधिमंडल पैटर्न किसी ऑब्जेक्ट को बाहरी विधि के लिए किसी कार्य के लिए ज़िम्मेदारी सौंपने का एक तरीका है। यह उस विधि का ट्रैक रखने के लिए प्रतिनिधि का उपयोग करता है। तो प्रतिनिधि के लिए एक उपयोग प्रतिनिधिमंडल पैटर्न को लागू करना है।

पैटर्न का उपयोग List<T>.Sort(comparison) विधि में उदाहरण के लिए किया जाता है, जहां सॉर्टिंग एल्गोरिदम एक प्रतिनिधि का उपयोग करता है जिसे आप आइटम की तुलना करने के लिए प्रदान करते हैं।

2

delegation pattern है:

एक डिजाइन पैटर्न [...] जहां एक वस्तु, बजाय एक संबद्ध सहायक ऑब्जेक्ट को अपने निर्धारित कार्यों में से एक, प्रतिनिधियों कि कार्य की।

दुर्भाग्य से, उस पृष्ठ जब यह उपयोग करने के लिए या क्या पैटर्न से

प्रतिनिधिमंडल पैटर्न मौलिक अमूर्त पैटर्न है कि अन्य सॉफ्टवेयर पैटर्न आबाद में से एक है, यह अलग से निकाले जाते हैं के बारे में ज्यादा वर्णन नहीं करता है इस तरह के संरचना (जिसे एकत्रीकरण भी कहा जाता है), मिश्रण और पहलुओं के रूप में।

describes delegation पृष्ठ से, आप यह समझ सकते हैं कि यह किसी ऐसे वर्ग के लिए एक सुविधा के कार्यान्वयन को प्रतिनिधि करना है जो रनटाइम पर ज्ञात हो या न हो।जब आप Foo.Bar() कहते हैं, तो इसका कार्यान्वयन प्रतिनिधि को Bar() का निष्पादन "सहायक ऑब्जेक्ट" में निष्पादित कर सकता है।

अब सी # प्रतिनिधि के लिए, जैसा कि कहा गया है, यह केवल एक फ़ंक्शन पॉइंटर है। यह संकलन समय या रनटाइम पर प्रतिनिधिमंडल विधि असाइन करके, एक प्रतिनिधिमंडल पैटर्न को लागू करने में मदद कर सकता है।

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