2012-04-10 18 views
5

से कॉल प्रतिनिधि विधियों को कॉल करें मुझे सी # में कक्षाओं में प्रतिनिधि प्रतिनिधि कॉल को प्रोग्राम करने का तरीका पता लग रहा है। मैं उद्देश्य-सी की दुनिया से आ रहा हूं, जो मुझे भ्रमित कर सकता है। उद्देश्य-सी में, मैं अभिभावक वर्ग (आईई, childViewcontroller.delegate = self;) होने के लिए, एक बाल वर्ग के अंदर एक प्रतिनिधि वस्तु असाइन कर सकता हूं। तब मैं का उपयोग करके प्रतिनिधि कक्षा में एक विधि आग कर सकते हैं:किसी अन्य वर्ग

if([delegate respondsToSelector:@selector(methodName:)]) { 
    [delegate methodName:parametersgohere]; 
} 

हालांकि, मैं कैसे सी # में ऐसा करने को समझ नहीं सकता। मैंने सामान्य रूप से सी # प्रतिनिधियों के बारे में कुछ पढ़ा है (उदाहरण के लिए, here), लेकिन मैं अभी भी अटक गया हूं।

क्या कोई उदाहरण है जो इसे समझाता है?

यहां मेरा परिदृश्य पूर्ण है: मेरे पास कक्षा ए है जो कक्षा बी के उदाहरण को तुरंत चालू करता है। क्लासबी एक विधि (जो एक वेब सेवा कहते हैं) को आग लगती है, और प्रतिक्रिया पर, मैं कक्षा ए में एक विधि को आग लगाना चाहता हूं।

कोई 'हैलो वर्ल्ड' ट्यूटोरियल्स के प्रकार जो वहां की मूल बातें समझा सकते हैं?

+1

याद दिलाएं कि सी #/.NET प्रतिनिधि उद्देश्य-सी/कोको प्रतिनिधियों से एक पूरी तरह से अलग चीज हैं। – BoltClock

+0

@ बोल्टक्लो'सा यूनिकॉर्न: हाँ, मुझे लगता है कि मैं गलत कह रहा हूं। लेकिन मैं अभी भी उपरोक्त परिदृश्य को दोहराने का तरीका जानना चाहता हूं। :-) – Brett

+0

"प्रतिनिधि" शब्द का अर्थ कई चीजें हो सकता है। सी # में इसका अर्थ है "एक ऑब्जेक्ट जो फ़ंक्शन पॉइंटर का प्रतिनिधित्व करता है"। मुझे यकीन नहीं है कि इसका मतलब क्या है। – Gabe

उत्तर

4

सी # में जो मुझे लगता है कि आप खोज रहे हैं उन्हें ईवेंट कहा जाता है। वे एक भाषा सुविधा हैं जो कक्षा के उदाहरण को सार्वजनिक प्रतिनिधि को इस तरह से बेनकाब करने की अनुमति देती है कि अन्य वर्ग के उदाहरण सब्सक्राइब कर सकें। घटना को बढ़ाने के लिए केवल उजागर वर्ग की अनुमति है।

अपने उदाहरण में:

public class ClassB { 
    // Note the syntax at the end here- the "(s, e) => { }" 
    // assigns a no-op listener so that you don't have to 
    // check the event for null before raising it. 
    public event EventHandler<MyEventArgs> MyEvent = (s, e) => { } 

    public void DoMyWork() { 
     // Do whatever 

     // Then notify listeners that the event was fired 
     MyEvent(this, new MyEventArgs(myWorkResult)); 
    } 
} 

public class ClassA { 
    public ClassA(ClassB worker) { 
     // Attach to worker's event 
     worker.MyEvent += MyEventHandler; 

     // If you want to detach later, use 
     // worker.MyEvent -= MyEventHandler; 
    } 

    void MyEventHandler(Object sender, MyEventArgs e) { 
     // This will get fired when B's event is raised 
    } 
} 

public class MyEventArgs : EventArgs { 
    public String MyWorkResult { get; private set; } 
    public MyEventArgs(String myWorkResult) { MyWorkResult = myWorkResult; } 
} 

ध्यान दें कि ऊपर तुल्यकालिक हो जाएगा। मेरी समझ यह है कि उद्देश्य-सी प्रतिनिधि सभी अभिनेता पैटर्न हैं, इसलिए वे असीमित हैं। उपर्युक्त एसिंच बनाने के लिए, आपको थ्रेडिंग में डेल करना होगा (शायद Google "सी # थ्रेड पूल" करना चाहते हैं)।

+1

मुझे लगता है कि ओपी को ए और बी को विपरीत तरीके से चाहिए;) बी बच्चा है, बी "कॉल" एक विधि है (इसलिए बी घटना को बढ़ाएं, इसे संदिग्ध करें) – gbianchi

+0

संभवतः- उस मामले में मैं उसे लाभ दे रहा हूं संदेह है कि वह पैटर्न को उलट करने के तरीके को समझ सकता है। –

+0

मैंने इसे किसी भी तरह से तय किया :-) –

3

एक प्रतिनिधि एक वस्तु है जो एक विधि को इंगित करता है, चाहे वह एक स्थिर या उदाहरण विधि हो। तो अपने उदाहरण के लिए, तुम सिर्फ घटना मॉडल का प्रयोग करेंगे:

class Caller { 
    public void Call() { 
     new Callee().DoSomething(this.Callback); // Pass in a delegate of this instance 
    } 

    public void Callback() { 
     Console.WriteLine("Callback called!"); 
    } 
} 

class Callee { 
    public void DoSomething(Action callback) { 
     // Do stuff 
     callback(); // Call the callback 
    } 
} 

... 

new Caller().Call(); // Callback called! 

Caller उदाहरण Callee उदाहरण के DoSomething विधि, जो बारी में कॉल के लिए एक प्रतिनिधि गुजरता उठाई-टू विधि, जिनमें से Callback विधि है Caller उदाहरण।

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