क्या कोई अग्रेषण और प्रतिनिधिमंडल के बीच अंतर को समझाएगा? वे समान दिखते हैं, लेकिन मुझे अग्रेषण की अच्छी परिभाषा नहीं मिली है, इसलिए मुझे यकीन नहीं है कि मैं वास्तव में समझता हूं।ओओपी में, अग्रेषण क्या है और यह प्रतिनिधिमंडल से अलग कैसे है?
उत्तर
वे एक ही वस्तु में समान विचार हैं जो मदद के लिए किसी अन्य पर निर्भर करता है। यहां बताया गया है कि मैं अपने मजबूत उद्देश्य-सी पूर्वाग्रहों के दो विचारों के बारे में सोचता हूं:
प्रतिनिधिमंडल: एक निर्णय लेने की आवश्यकता है, लेकिन मैं इसे बनाना नहीं चाहता हूं। मैं अपने प्रतिनिधि को संभालने दूँगा।
कोको में, उदाहरण के लिए, NSTableView तालिका के व्यवहार को अनुकूलित करने के लिए एक प्रतिनिधि का उपयोग करता है। प्रतिनिधिमंडल एक वस्तु को अनुकूलित करने का एक तरीका प्रदान करता है, प्रतिनिधि, अनुकूलन प्रदान करता है। उदाहरण के साथ जारी रखते हुए, एक टेबल व्यू का प्रतिनिधि NSTableViewDelegate इंटरफेस लागू करता है जो तालिका अपने प्रतिनिधि से बात करने के लिए उपयोग करती है।
अग्रेषण: किसी ने मुझे सिर्फ एक संदेश भेजा है जिसे मैं समझ नहीं पा रहा हूं, लेकिन मुझे एक और वस्तु पता है जो इसे लागू कर सकता है। मैं उस संदेश पर उस संदेश के आमंत्रण को पास कर दूंगा।
कोको में, फिर भी, कोई भी वर्ग -forwardInvocation: विधि को कार्यान्वित कर सकता है। यदि किसी ऑब्जेक्ट को कोई संदेश भेजा जाता है जो इसे कार्यान्वित नहीं करता है, तो उस ऑब्जेक्ट के लिए -forwardInvocation: विधि कहा जाता है, और ऑब्जेक्ट किसी ऑब्जेक्ट पर आमंत्रण को पास करने का निर्णय ले सकता है। वह ऑब्जेक्ट इसके प्रतिनिधि हो सकता है, या यह कुछ सिस्टम-व्यापी त्रुटि हैंडलर हो सकता है, या जो भी हो। NSProxyसभी विधियों को लागू करने के लिए इसका उपयोग करने के लिए इसका उपयोग करता है - यह केवल अपने मास्टर ऑब्जेक्ट पर आमंत्रण पास करता है।
ध्यान दें कि अग्रेषण के साथ, एक निर्धारित प्रतिनिधि इंटरफ़ेस नहीं है; संदेश सिर्फ किसी अन्य वस्तु पर भेजा गया है। एक और स्थान जो आप देखते हैं कि मैं अग्रेषण कहूंगा, वह तब होता है जब एक ऑब्जेक्ट में एक और ऑब्जेक्ट होता है जो कुछ इंटरफ़ेस को लागू करने के लिए उपयोग करता है। उस इंटरफ़ेस के लिए कोई भी संदेश केवल निहित ऑब्जेक्ट को अग्रेषित किया जाता है, जो सभी काम करता है।
अग्रेषण "रोकथाम के माध्यम से विरासत" या "क्रियान्वयन विरासत को कठिन तरीके" जैसा है।
विशिष्ट कार्यान्वयन विरासत:
class Base
{
public:
void baseFn() { }
};
class Derived : public Base
{
public:
void derivedFn() { }
};
अब, व्युत्पन्न का एक उदाहरण एक baseFn() विधि है। यह विभिन्न वर्गों के बीच कार्यान्वयन साझा करने का एक तरीका है।
अग्रेषण इस तरह दिखता है:
class Contained
{
public:
void containedFn() { }
};
class Thing
{
public:
void thingFn() { }
void containedFn() { mContained.containedFn(); }
private:
Contained mContained;
};
तुम भी लागू किया जा सकता था कि निजी विरासत के साथ।
प्रतिनिधिमंडल अग्रेषण का एक विशेष मामला है, जहां "आगे बढ़ने के लिए" एक इंटरफ़ेस है।
class Delegate
{
public:
virtual void doDelegateAction() = 0;
};
class DelegateA : public Delegate
{
virtual void doDelegateAction() { }
};
class DelegateB : public Delegate
{
virtual void doDelegateAction() { }
};
class Thing
{
public:
void Thing (Delegate * delegate) { mDelegate = delegate; }
void thingFn() { }
void containedFn() { if (mDelegate) mDelegate->doDelegateAction(); }
private:
Delegate * mDelegate; // Note, we don't own this memory, buyer beware.
};
अब, आप बाहर प्रतिनिधि के कार्यान्वयन कार्यावधि में अग्रेषण आप नहीं कर सकते हैं (और आप नहीं करना चाहते हो सकता है, जिसके कारण आप इसे करना होगा) में स्वैप कर सकते हैं, जबकि।
यदि यह गलत प्रश्न का उत्तर देता है, तो मुझे एक टिप्पणी में बताएं और मैं जवाब हटा दूंगा।
मुझे नहीं लगता कि 'unique_ptr' कॉपी करने योग्य है। –
तो क्या आप कह रहे हैं कि कक्षा में वर्ग के भीतर नियुक्त प्रतिनिधि वस्तु की आवश्यकता होती है, लेकिन प्रतिनिधिमंडल वैकल्पिक रूप से कक्षा के बाहर तत्काल वस्तुओं का उपयोग कर सकता है? दोनों के बीच भेद अभी भी पूरी तरह से स्पष्ट नहीं है। – vette982
@ vette982 क्षमा करें, मैंने अपने आखिरी उदाहरण में एक महत्वपूर्ण चोटी छोड़ी ... जल्द ही आ रहा है संपादित करें। –
चलो पहले परिभाषित दो शब्दों:
- इस:
the object that sends a message/task to another object(the receiver)
- रिसीवर:
the object that receives a message/task from the sender
अग्रेषण और प्रतिनिधिमंडलके बीच अंतर यह है कि forwa मेंthe receiver acts in its own context
जबकि प्रतिनिधिमंडलthe receiver acts on the behalf of the sender
में।
प्रतिनिधिमंडल और अग्रेषण दोनों बहुत समान हैं:
यहाँ इस blog post से एक महान प्रतीक है। एक रूपक जो उन्हें अलग करने में मदद कर सकता है, वह एक ईमेल प्राप्त करने के बारे में सोचना है जो आपको एक योग्य दान के लिए कुछ पैसे दान करने के लिए कह रहा है।
- आप आगे एक दोस्त को ईमेल, और दोस्त पैसा दान करते हैं, तो दोस्त अपने स्वयं के पैसे दान और अपने स्वयं के कर की रसीद हो रही है।
- यदि आप प्रतिनिधि अपने एकाउंटेंट का जवाब देते हैं, तो लेखाकार दान के लिए आपके पैसे दान करता है और आपको कर रसीद प्राप्त होती है।
यह सुनिश्चित नहीं है कि यह क्यों मतदान किया गया ... यह एक उपयोगी सवाल की तरह लगता है, हालांकि यह थोड़ा अधिक विस्तार का उपयोग कर सकता है। दुर्भाग्यवश, हम यहां कैच -22 में हो सकते हैं। मैं एक उत्तर देने का प्रयास करूंगा, और प्रश्नकर्ता मुझे बता सकता है कि क्या मैं सही ढंग से समझता हूं। –