2009-02-03 15 views
7

जब आपके पास एक क्लास कार है जो IVehicle लागू करती है और आप इसे एक सजावट में लपेटना चाहते हैं जो आगे की सभी कारों को कॉल करती है और उन्हें गिना जाता है, तो आप इसे कैसे करेंगे?सी # में प्रॉक्सी या सजावटी वर्ग को लागू करने का सबसे छोटा तरीका क्या है?

रूबी में मैं बस किसी भी तरीके के बिना एक सजावट का निर्माण कर सकता हूं और कार ऑब्जेक्ट पर सभी कॉल अग्रेषित करने के लिए method_missing का उपयोग कर सकता हूं।

जावा में मैं एक प्रॉक्सी ऑब्जेक्ट बना सकता हूं जो एक विधि के माध्यम से सभी कोड चलाता है और बाद में इसे आगे बढ़ाता है।

क्या सी # में कोई समान बात है जो मैं कर सकता हूं?


अद्यतन:

answeres पर है और यह इस के लिए एक विधि समान लिखने के लिए संभव हो जाना चाहिए क्या मैं System.Reflection.Emit के बारे में पढ़ा आधारित:

Type proxyBuilder(Type someType, delagate functionToBeApplied, Object forward) 

जहां प्रकार कुछ प्रकार के सभी इंटरफ़ेस लागू करता है, फ़ंक्शन निष्पादित करता है और फिर इसके बदले में ऑब्जेक्ट को ऑब्जेक्ट करने के लिए विधि कॉल को आगे बढ़ाता है।

क्या कुछ lib है जो सिर्फ मुझे करता है या मुझे अपना खुद लिखना होगा?

उत्तर

4

प्रॉक्सीइंग के लिए यदि आप मानक प्रकारों का उपयोग करना चाहते हैं तो आप "रियलप्रॉक्सी" में देख सकते हैं, हालांकि इसका उपयोग करने में परेशानी का थोड़ा सा हिस्सा है (और इसके लिए आपकी कक्षाओं को मार्शलबीरफॉब ऑब्जेक्ट से प्राप्त करना आवश्यक है)।

public class TestProxy<T> : RealProxy where T : class 
{ 
    public T Instance { get { return (T)GetTransparentProxy(); } } 
    private readonly MarshalByRefObject refObject; 
    private readonly string uri; 

    public TestProxy() : base(typeof(T)) 
    { 
     refObject = (MarshalByRefObject)Activator.CreateInstance(typeof(T)); 
     var objRef = RemotingServices.Marshal(refObject); 
     uri = objRef.URI; 
    } 

    // You can find more info on what can be done in here off MSDN. 
    public override IMessage Invoke(IMessage message) 
    { 
     Console.WriteLine("Invoke!"); 
     message.Properties["__Uri"] = uri; 
     return ChannelServices.SyncDispatchMessage(message); 
    } 
} 

वैकल्पिक रूप से आप .. मिल सकता है कैसल से "DynamicProxy" यह थोड़ा मेरे अनुभव में बेहतर काम करता है ..

आप उन में से एक का उपयोग करते हैं तो आप जरूरी हालांकि शानदार प्रदर्शन नहीं मिलेगा, मैं का उपयोग करें उन्हें मुख्य रूप से कॉल में जो संभवतः पहले स्थान पर धीमा हो जाएगा .. लेकिन यदि आप चाहें तो आप इसे आजमा सकते हैं।

मार्क के समाधान में बेहतर प्रदर्शन होगा।

2

दुर्भाग्यवश, सी # में कोई मिश्रण समर्थन नहीं है। तो आपको यह करने के लिए सभी विधियों को लागू करने की आवश्यकता होगी, या कुछ भारी शुल्क प्रतिबिंब का उपयोग करें। अन्य वैकल्पिक एक (वैकल्पिक) प्रॉक्सी/डेकोरेटर आधार वर्ग

abstract class FooBase : IFoo { 
    protected FooBase(IFoo next) {this.next = next;} 
    private readonly IFoo next; 
    public virtual void Bar() { // one of the interface methods 
     next.Bar(); 
    } 
    public virtual int Blop() { // one of the interface methods 
     return next.Blop(); 
    } 
    // etc 
} 

तो

class SomeFoo : FooBase { 
    public SomeFoo(IFoo next) : base(next) {} 
    public override void Bar() {...} 
} 

यह देखते हुए कि FooBase का उपयोग सख्त वैकल्पिक है है ...; किसी भी IFoo की अनुमति है।

+0

कृपया, कुछ शब्दों में समझाएं, "FooBase' का उपयोग कड़ाई से वैकल्पिक" क्या है? क्या यह "किसी भी 'IFoo' की अनुमति है"? अर्धविराम मुझे अलग-अलग बयान पढ़ता है और तर्क भ्रम को जोड़ने के लिए आत्मनिर्भर है। सीपीटी के बावजूद। स्पष्ट फुसफुसाते हुए: "इसका मतलब यह है कि 'FooBase' को किसी अन्य' IFoo' के साथ प्रतिस्थापित किया जा सकता है, 'IFoo' को' FooBase' करता है 'में लागू करने के लिए, यदि यह इतना आसान है तो मैं निराश होगा। उत्तर से निराश न हों, बल्कि मेरे परान्या के साथ। "verboseness" के लिए खेद है (अब मुझे idiom खोजने की जरूरत है, इस घटना के अनुरूप) –

+1

मुझे लगता है कि यह आपका निराशाजनक उत्तर है; कोड केवल 'IFoo' पर निर्भर होना चाहिए; 'FooBase' कोड के लिए एक सुविधा है जो 'IFoo' को लागू करने का विकल्प चुनती है। –

+0

धन्यवाद!यदि आपके पास समय है, तो कृपया दो और प्रश्नों का उत्तर दें: ** 1) ** यह विषय पहले से 6 साल का है, ऐसा लगता है कि तब से कुछ भी नहीं बदला है और समस्या को हल करने के तरीके अभी भी वही हैं? * (कभी नहीं सोचा कि मैं सी ++ याद करूँगा, लेकिन इसमें '->' ओवरलोडिंग है) * ** 2) ** क्या मुझे यह गलत लगता है: आप कह रहे हैं कि अमूर्त वर्गों से उत्तराधिकारी होना बुरा व्यवहार है? मैं स्वयं उन्हें डिफ़ॉल्ट कार्यान्वयन के साथ इंटरफेस मानता हूं और वे काफी सुविधाजनक हैं। और स्पष्ट रूप से 'IFoo' के रूप में 'SomeFoo' उदाहरणों को संदर्भित कर सकते हैं। * (इस बीच, एमएस ने विस्तार विधियों को लागू किया 'polymorphism ..) * –

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

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