2011-01-26 17 views
10

मैंने हाल ही में एक कंपनी में 6 महीने की इंटर्नशिप समाप्त की है जो उनके प्रोग्रामिंग के अधिकांश भाग के लिए सी # का उपयोग करती है। इस समय के दौरान मैंने पहली बार इस्तेमाल किया और घटनाओं के सी # तरीके से आदी हो गई। जैसा कि नीचे दिखाया गया है:सी # डी प्रोग्रामिंग भाषा में घटनाओं की तरह

acc.AccountBalanceLow += new AccountBalanceDelegate(atm.AccountToLow); 
acc.AccountBalanceLow +=new AccountBalanceDelegate(atm.AccountToLowAgain); 

क्या डी इस तरह के निर्माण का समर्थन करता है? मुझे लगता है कि ऑपरेटर ओवरलोडिंग का उपयोग करके उपयोगकर्ता द्वारा बनाया जा सकता है, लेकिन मुझे पूरी तरह से यकीन नहीं है। यदि यह संभव नहीं है तो फिर ऐसा करने का एक आम तरीका क्या होगा?

उत्तर

11

डी में समकक्ष निर्माण Signals and Slots का उपयोग करना है। यह Observer Pattern को लागू करने का एक अलग माध्यम है, जो प्रभावी रूप से सी # घटना करता है।

4

डी (और सी ++) signals and slots नामक एक समान पैटर्न का उपयोग करते हैं।

1

आप संकेतों और स्लॉट के बजाय सी # शैली-घटनाओं उपयोग करने की आवश्यकता महसूस कर रहे हैं, वे लागू करने के लिए अत्यंत सरल कर रहे हैं:

module fluidity.core.event; 

class Event { 
    alias void delegate(EventArgs) handler_t; 

    handler_t[] handlers; 
    Object owner; 

    this() {} 
    this(Object o) { owner = o; } 

    void attach(handler_t handler) { 
     if (handler) 
      handlers ~= handler; 
    } 

    void detach(handler_t handler) { 
     int i = -1; 
     foreach (j, h; handlers) 
     { 
      if (h is handler) 
      { 
       i = j; 
       break; 
      } 
     } 

     if (i > -1) 
      handlers = handlers[0..i] ~ handlers[i+1..$]; 
    } 

    void raise() { raise(new EventArgs(owner)); } 
    void raise(EventArgs e) { 
     // call all handlers 
     foreach (handler; handlers) 
     { 
      if (handler) 
       handler(e); 
     } 
    } 

    void opAddAssign(handler_t handler) { 
     attach(handler); 
    } 

    void opSubAssign(handler_t handler) { 
     detach(handler); 
    } 

} 

class EventArgs { 
    Object source; 
    bool handled; 

    void handle() { handled = true; } 

    this() {} 
    this(Object s) { 
     source = s; 
    } 
} 
0

बाहर चेक DFL की घटना प्रणाली। यह सी # .NET के समान ही काम करता है।

DFL Event Example

डाउनलोड DFL, घटनाओं मॉड्यूल हड़पने और इसे जिस तरह से आप की तरह इस्तेमाल करते हैं। मैंने इसे विविध टेम्पलेट तर्कों का उपयोग करने के लिए संशोधित किया। यह अधिकतम लचीलापन देता है।

events.d:

import std.signals; 

class Event(T...){ 
    mixin Signal!(T);  

    void broadcast(T args){ 
     emit(args); 
    }  
    void opAddAssign(slot_t slot){ 
     connect(slot); 
    } 
    void opSubAssign(slot_t slot) { 
     disconnect(slot); 
    } 
} 

घोषणा:

public Event!(int) onSomeEventOfInt; 
    public Event!(string, int) onSomeEventOfStringAndInt; 

http://www.dprogramming.com/dfl098.zip

1

यहाँ संकेतों, स्लॉट्स, और एक टेम्पलेट का उपयोग कर ग # शैली की घटनाओं का एक उदाहरण है तत्काल:

this.onSomeEventOfInt = new Event!(int)(); 
    this.onSomeEventOfStringAndInt = new Event!(string, int)(); 

आग घटना:

int i = 4; 
    string str = "hello"; 
    this.onSomeEventOfInt.broadcast(i); 
    this.onSomeEventOfStringAndInt.broadcast(str, 4); 

पर्यवेक्षक पंजीकरण:

obj1.onSomeEventOfInt += &handleEventOfInt 
    obj1.onSomeEventOfStringAndInt += &handleEventOfStringAndInt 

    void handleEventOfInt(int g) 
    { /*do something */ } 
    void handleEventOfStringAndInt(string str, int g) 
    { /*do something */ } 
संबंधित मुद्दे