2013-03-04 7 views
5

मैं एक विस्तार विधि के साथ घटनाओं की परवरिश के बारे में कई पदों पाया है का उपयोग करके ईवेंट जोड़ें, फिर भी मेरे सवाल का एक सा अलग है:एक्सटेंशन तरीकों

मैं इस तरह एक अंतरफलक है:

public interface IStateMachine 
{ 
    void SetState(IState NewState); 
    IState GetState(); 
} 

इस इंटरफ़ेस का उपयोग करना इस प्रकार की तरह मैं एक विस्तार विधि बना सकते हैं: एक statechange-event:

public static void ChangeState(this IStateMachine StateMachine, IState NewState) 
{ 
    StateMachine.GetState().Exit(); 
    StateMachine.SetState(NewState); 
    StateMachine.GetState().Enter(); 
} 

क्या मैं वास्तव में चाहते हैं कि वहाँ की घटनाओं निकाल दिया जा करने के लिए, उदाहरण के लिए जरूरत है कि हो जाएगा।

हालांकि मैं StatechangeEventIStateMachine इंटरफ़ेस का हिस्सा बनना नहीं चाहता, लेकिन ऐसा लगता है कि यह एकमात्र तरीका है। मेरे पास कई कक्षाएं हैं जो IStateMachine लागू करती हैं, और इसलिए मुझे हर बार एक ही कोड को फिर से करना होगा।

उत्तर

4

सी # में, केवल एक्सटेंशन विधियां हैं। कोई विस्तार गुण या घटनाओं।

आपको इंटरफ़ेस पर ईवेंट घोषित करना होगा।
एक ही घटना कोड लिखने की आवश्यकता से बचने के लिए, आप बेस क्लास बना सकते हैं।

एक और संभावना Publish-Subscribe पैटर्न को "मैन्युअल रूप से" कार्यान्वित करना होगा। सी # में यही घटनाएं हैं।

आप एक्सटेंशन विधियों Subscribe और Unsubscribe से IStateMachine जोड़ सकते हैं।

वे संभावित रूप से स्थिर वर्ग StateMachineSubscribers का उपयोग करेंगे जो Subscribe और Unsubscribe विधियों का भी खुलासा करता है। इसके अतिरिक्त, यह आपके ChangeState एक्सटेंशन विधि द्वारा उपयोग की जाने वाली Raise विधि का खुलासा करता है।

+0

धन्यवाद, मैं इसे देख लूंगा। मेरे पास विभिन्न प्रकार के वर्ग हैं जो सभी एक IStateMachine हो सकते हैं। जब मैं आधार सारणी कक्षा बना रहा हूं तो मुझे कई विरासत में समस्याएं आ रही हैं। – avanwieringen

+0

@avanwieringen: उस मामले में विस्तार विधियों के माध्यम से इंटरफ़ेस पर पब/सब लागू करना बेहतर विचार प्रतीत होता है। –

0

उसके संगत प्रतिनिधि के साथ घटना एक ठोस वर्ग कि औजार कि IStateMachine इंटरफ़ेस का एक हिस्सा हो सकता है। इसलिए यदि आप इंटरफेस पर SetState पर कॉल करते हैं, तो कंक्रीट कुछ कंक्रीट वर्ग के कार्यान्वयन को कॉल किया जाता है, जिसमें इसके अंदर एक ईवेंट बढ़ता है।

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