2012-03-27 17 views
5

मेरे पास एक कक्षा है जो इंटरफेस को लागू करने वाले दो वर्गों को तुरंत चालू करती है। मैं चाहता हूं कि एक वर्ग दूसरे वर्ग को सूचित करे कि कुछ ठीक है। मैं इसे एक एक्शन के साथ कर सकता था और फिर कक्षा में निजी चर का उपयोग करता था लेकिन सोचता था कि क्या गुणों के साथ ऐसा करने का सीधा तरीका है ताकि जब किसी संपत्ति का मूल्य बदलता है तो यह किसी अन्य वर्ग पर एक संपत्ति अपडेट करता है।एक्शन <T> गुणों के बराबर

उदाहरण के लिए:

public class MyClass 
{ 
    public ILogger Logger {get;set;} 
    public ILogic Logic {get;set;} 

    private Form MyWinform; 

    public void Setup() 
    { 
    MyWinform = new MyWinform(); 
    MyWinform.StartBatch += Logger.CreateFile; //Create file when user presses start 

    //How can I set a property on ILogic to be AllOk once ILogger says so?? 

    //I could use an Action so that once all is ok I call IDecidedAlOK in ILogger which 
    //can then assign a private bool variable inside the class 

    Logic.ItsOKMethodSoSetVariableToTrue = Logger.IDecidedAllOKMethod; 

    } 

    public void DataIn(string Value) 
    { 
    Logic.DataIn(Value); 
    } 

    public void CreateInstances() 
    { 
    Logger = new FileLogger(); 
    Logic = new MyLogic(); 
    } 

} 

public class MyLogic : ILogic 
{ 
    public void DataIn(string Value) 
    { 
    //I want to check that all is ok before I do anything 

    //if (!AllOK) 
    //return; 

    //Do stuff 
    } 
} 
+0

क्या आपके पास आईएलओगर वर्ग है, मेरा मतलब है, क्या आप इसमें बदलाव कर सकते हैं? – Stormenet

+1

क्या 'ILogger' एक 'AllOK' ईवेंट का पर्दाफाश कर सकता है जो 'ILogic' सदस्यता ले सकता है? – mellamokb

+0

@Stormenet हाँ मैं – Jon

उत्तर

3

लागू INotifyPropertyChanged इंटरफेस और PropertyChanged घटना

+0

के साथ ऐसा करने का सीधा तरीका था, लेकिन मैं इसे टालने की कोशिश कर रहा था लेकिन यह एक लोकप्रिय दृष्टिकोण प्रतीत होता है। सोचो कि मैं एक कस्टम घटना के साथ जाऊंगा हालांकि – Jon

0

मुझे लगता है की सदस्यता की तरह यह अपने ILogger इंटरफ़ेस एक "FileCreated" या की तरह कुछ का पर्दाफाश "करने के लिए थोड़ा और पारंपरिक हो सकता है तैयार "घटना, और इलोगिक ऑब्जेक्ट को अपडेट करने के लिए अपने एप्लिकेशन को उस ईवेंट को संभालने की अनुमति दें (या जो भी आवश्यक हो)।

संपादित करें: मेरी माफ़ी, प्रश्न को दोबारा पढ़ने के बाद, मुझे लगता है कि मैं जो भी पूछ रहा था उसे गलत समझा।

कोई "प्राकृतिक" वस्तु करता है कि आप वास्तव में क्या कह रहे हैं नहीं है, लेकिन आप एक अनाम प्रतिनिधि (या लैम्ब्डा अभिव्यक्ति) इस उद्देश्य के लिए बना सकते हैं:

Action<bool> loggerResult = (value) => Logic.ItsOKMethodSoSetVariableToTrue = value; 
0

एक संपत्ति आंतरिक रूप से होते हैं दो निजी तरीकों, एक get_XXX और एक set_XXX, इसलिए जब तक कि आप उन विधियों के MethodInfo को प्राप्त नहीं करना चाहते हैं और उन्हें आमंत्रित करते हैं (जो फिर से विधियां हैं) आपके पास कोई विधि कॉलिंग दृष्टिकोण लागू करने के अलावा कोई विकल्प नहीं है।

0

घटना (INotifyPropertyChanged या कुछ कस्टम एक) ठीक है की सदस्यता लेना है, इसलिए एक लैम्ब्डा-सेटर पारित करने के लिए तरीका है, लेकिन कुछ मामलों में यह अधिक (बहुत साझा स्मृति अवधारणा की तरह एक साझा संदर्भ वस्तु का उपयोग करने के लिए convinient हो सकता है):

class ConversationContext 
{ 
    public bool EverythingIsOK { get; set;} 
} 

इस वस्तु सभी इच्छुक वस्तुओं (ILogic और ILogger) को पारित कर दिया है और वे कुछ आंतरिक गुण के बजाय उस पर सीधे काम करते हैं,। यदि अधिसूचनाओं की आवश्यकता है, तो INotifyPropertyChanged लागू करें।

इस दृष्टिकोण का एक सकारात्मक पहलू यह है कि आप बार-बार फायरिंग घटनाओं में अन्य घटनाओं को ट्रिगर करने में उलझन में नहीं होंगे। एक ही ऑब्जेक्ट वर्तमान स्थिति को पकड़ लेगा और आवर्ती अपडेट की आवश्यकता नहीं है।

फिर, यह कई विकल्पों में से एक है।

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